某公司的笔试题,自己分析得出的答案,并在后面对二维数组元素表示形式做出总结。新手朋友别嫌啰嗦,耐心看完并记住对你会有帮助的。老鸟们也欢迎来提意见。
int a[4][4] = {
{1,2,3,4},
{50,60,70,80},
{900,1000,1100,1200},
{13000,14000,15000,16000}
};
int (*p1)[4] = a;
int (*p2)[4] = &a[0];
int *p3 = &a[0][0];
printf("%d, %d, %d, %d\n",
*(*(a+1)-1),
*(*(p1+3)-2)+1,
*(*(p2-1)+16)+2,
*(p3+sizeof(p1)-3)
);
64位环境,问上述代码的运行结果。
好吧来分析,首先二维数组名指向的是二维数组的首行地址,
int(*p1)[4]=a,是一个指向四个整型数组的指针;
int *p3=&a[0][0],将二维数组按一维数组的方式引用;
第一个输出:a+1即第二行的地址,*(a+1)即第二行的第一个元素的地址,再减一是它前面的元素地址,即第一行第四个元素,结果为4.
第二个输出:p1和p2和a是一样的,p1+3即第四行的地址,*(p1+3)即第四行第一个元素的地址,再减二则是第三行第三个元素的地址,结果为1101。
第三个输出:p2-1为第四行地址,*(p2-1)表示第四行第一个元素地址,加上16即绕一圈还是这个元素,结果为13002。
第四个输出:64位环境,则sizeof(p1)是8,p3+5表示一维数组第五个元素,即二维数组第二行第二个元素,结果为60。
嗯来做个总结吧:
二维数组元素a[i][j]有下面几种引用形式:
*(a[i]+j) //a[i]为数组第i行地址,再加j即为数组第i行j列地址
*(*(a+i)+j) //a+i为数组第i行地址,*(a+i)为数组第i行0列地址,再加j即为第i行j列地址