在下面这个程序里,a[i][j] 和一个普通的整型变量一样使用。
#include<iostream>
using namespace std;
int main()
{
int a[10][10]={0};
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
if(i==j)
{
a[i][j]=1;
}
}
}
}答案A。指针和数组的代码追踪:画出变量和指针的内存示意图,追踪每次赋值后值的变化。
指针和数组追踪时画内存布局图可以大大简化理解。
【考点】二维数组定义|部分初始化规则|循环边界控制
考纲定位:本题考查 GESP 四级"数组与二维数组"模块中的局部数组初始化规则。命题人专门在此处设题,就是要卡住那些把"数组必须全元素显式初始化"当成铁律的考生。
解题思维:看到 int a[10][10]={0}; 先确认这是局部数组,C++ 允许部分初始化,剩余元素自动补 0。双重循环里 i==j 时把主对角线置 1,边界完全在 0-9 内,没有越界风险。因此程序逻辑正确,运行无误。
陷阱拆解:选项 B 错误。命题人利用的是"数组初始化必须列出所有元素"的绝对化误区,以及初学者常混淆全局数组(自动初始化)与局部数组(不会自动初始化)的区别。还有,很多人会纠结二维数组的初始化语法,以为 a[10][10]={0} 无效。
反命题思维:若把数组改成 int a[10][10]; 而不初始化,程序仍能编译运行,只是未初始化元素值不确定。若把循环条件改成 i<j,则只填充下三角。刷到类似题,先问自己:命题人想考我的是初始化规则、二维数组语法,还是循环边界?