某公司的筆試題,自己分析得出的答案,並在後面對二維數組元素表示形式做出總結。新手朋友別嫌啰嗦,耐心看完並記住對你會有幫助的。老鳥們也歡迎來提意見。
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列地址