1樓:匿名使用者
其實這是c在實現多維陣列時的魔術而已,實際上a就是一個12個int的資料區。你在寫a[1][2]時編譯器實際上知道這個陣列一行是4個元素,所以計算它的地址為a+(1*4)+2,即a[1][2]就是*(a+(1*4)+2)。
另一方面,編譯器允許使用形如a[1]這樣的表述,由於它知道a是一個定義為a[3][4]的陣列,所以它知道a+1實際上應該將a這個首地址加上4個int的大小,你如果再試一下就會發現在int為4個位元組的機器上a[1]應該是a加上4.
c語言中的指標的值雖然可能是同一個記憶體地址,但是編譯器知道它的語言不同,在做同樣的指標增量的時候加的地址也是不同的。就像你如果把a的值強制轉換成char *,比如char *p = (char *)a;再看p+1就只是指向a[0][0]的第二個位元組了一樣。同樣的+1,含義卻是不同的。
這樣你就應該明白了,雖然*(a+1)的值只能是跟a+1一樣,因為它也只能指向a[1][0],但是編譯器知道它再增量的話就只需要加上1個int的大小,而不是4個int的大小了。因此*((a+1)+2)實際上是指向a[3],而*(*(a+1)+2)就是*(a[1]+2),也就是a[1][2]了。
2樓:
前者是行指標,後者是列指標,你再看看書,他們是有區別的.
怎麼理解指向二維陣列的陣列指標是二級指標
一維陣列的名其實就是指標,如int a 4 a就相當於一個指標 int p a 沒錯 但是二維陣列 int aa 2 3 這個時候是不能用int pp aa 是錯誤的。實際上二維陣列的第一維是int ab 3 是個指標陣列,不是陣列指標。這個時候int ab 3 是與 int 不同的。所以接受二維陣...
二維陣列名是不是「指標」,二維陣列名是不是一個「指標」?
理解一復 陣列名就是地址制常量,地址常量就是不能更改的地址,一旦定義了一個陣列就定了 指標是變數,這是和陣列本質的區別,他可以令他隨意等於任何一個有效的地址 理解二 個人認為陣列名不佔空間,就是個標誌,名字,和人名一樣,人名不佔空間,a 5 a作為左值,實際就是一個地址,在c語言中,廣義的說,任何名...
c語言for迴圈與二維陣列的問題
首先你所給的程式就存在錯誤,這是我幫你修改後的程式 include stdio.h int main i,k,t for i 0 i 3 i for k i i k 4 k if a i i for i 0 i 4 i printf d,a 0 i return 0 執行後的結果是6,4,3,2.第...