某公司的笔试题,自己分析得出的答案,并在后面对二维数组元素表示形式做出总结。新手朋友别嫌啰嗦,耐心看完并记住对你会有帮助的。老鸟们也欢迎来提意见。
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) );
好吧来分析,首先二维数组名指向的是二维数组的首行地址,
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列地址
原文地址:http://blog.csdn.net/u011421608/article/details/40113131