首先,我們來先定義一個二維數組
int a[3][4]= {{1,3,5,7},{9,11,13,15},{17,19,21,23}};
a是數組名,a是一個3行4列的數組。
a數組包含3行元素,即a[0],a[1],a[2]。而每一個行元素又是一個一維數組,它包含4個元素(即4個列元素),
例如,a[0] ?所代表的一維數組又包含4個元素。a[0][0],a[0][1],a[0][2],a[0][3],可以認為二維數組是數組的數組,
即二維數組a是有3個數組所組成的。
我們可以知道,a是二維數組名,它也可以表示二維數組首元素的地址,
現在的首元素不是一個簡單的整型元素,而是由4個整型元素組成的一維數組,
因此,a代表的是首行(即序列為0的行)的首地址,a+1代表序列為1行的首地址。
如果二維數組首地址為2000,一個整型數據占4個字節,則a+1的值應該是2000+4*4 = 2016(因為第0行有4個整型數據)。
a+1 指向 a[1],或者說 a+1的值是 a[1]的首地址。
a+2 的值代表 a[2]的首地址。
a[0],a[1],a[2]既然是一維數組名,而C語言又規定了數組名代表數組首元素的地址,
因此,a[0]代表一維數組a[0] 中第0列元素的地址,即 &a[0][0].
也就是 a[1] 的值是 &a[1][0],a[2]的值是&a[2][0].
a[0] ?是一維數組名,那么一維數組中序號為1的元素的地址顯然用a[0]+1 來表示了。
如果a[0] 的地址是2000,則a[0]+1 = 2000+1*4 = 2004?
那么 a[0]+2 則應該等于 &a[0][2]?
a[0] +3 = &a[0][3]
我們在前面提到過,a[0] 和 *(a+0)等價。
那么 a[1] 和*(a+1) 等價。
a[i] 和 *(a+i) 等價了。
因此 a[0]+1 和 *(a+0) + 1 都是&a[0][1]
二維數組中,第一維數組的值表示的是第二維數組的地址。
所以 a[1] +2 和 *(a+1)+2 的值都是 &a[1][2]
進一步分析,欲得到a[0][1] 的值,用地址法如何表示呢?
既然 a[0]+1 和 *(a+0)+1 是 a[0][1]的地址,那么*(a[0]+1) 就是 a[0][1]的值了,
同理,*(*(a+0)+1) 或 *(*a+1)也就是 a[0][1] 的值。
*(a[i]+j) 或 *(*(a+i)+j) 是a[i][j] 的值。。
*(a+i) ?和 ?a[i] 是等價的。
?
#include <stdio.h> int main(){ int a[3][4] = {1,3,5,7,9,11,13,15,17,19,21,23}; printf("%d,%d\n",a,*a); printf("%d,%d\n",a[0],*(a+0)); printf("%d,%d\n",&a[0],&a[0][0]); printf("%d,%d\n",a[1],a+1); printf("%d,%d\n",&a[1][0],*(a+1)+0); printf("%d,%d\n",a[2],*(a+2)); printf("%d,%d\n",&a[2],a+2); printf("%d,%d\n",a[1][0],*(*(a+1)+0)); printf("%d,%d\n",*a[2],*(*(a+2)+0)); return 0; }?
?
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
