1. 程式人生 > >三維陣列的地址計算問題

三維陣列的地址計算問題

假設以行優先順序儲存三維陣列A[5][4][3],其中元素A[0][0][0]的地址為0,且每個元素佔2個儲存單元,則printf("%d\n",A[4][3]+2)輸出什麼

好吧,我在筆試的時候居然寫了個160,我以為是A[4][3]已經到了5*4*2的地方,也就是40,然後再加5*4*2,就又是一個40,再乘以2就是到了160的地方(完全錯誤的想法,腦子太糊塗了,難怪面試總過不了)

正確思路:

行優先:從右往左進位 列優先:從左往右進位
把三維座標想象成立方體。分配的空間A[5][6][7]表示層高為5、行數為6、列數為7 因為數數的基本單位其實是列,二維座標是行號列號,雖然平時可能習慣行號列號層號,但是按照二維的規律,那麼三維座標應該是層號行號列號
那麼A[4][3][2]中4、3、2分別對應這個點的層數、行號、列號 位置為4*(4*3)+3*3+2=59 每個元素兩個儲存單元,最終結果為59*2=118

原始碼:

#include<stdio.h>
#include<string.h>
int main(int argc, const char *argv[])
{
    short a[5][4][3];
    printf("short:%d\n",sizeof(a[0][0][0]));
    printf("a[5][4][3]:%d\n",sizeof(a)/sizeof(a[0][0][0]));
    printf("a[5][4][3]:%d\n",&(a[4][3][2])-&a[0][0][0]);
    printf("a[5][4]+2:%d\n",(a[4][3]+2)-&a[0][0][0]);

    return 0;
}

執行結果:


這裡就有個問題值得思考了,為什麼輸出的是實際的個數,而不是兩者地址的減呢?

來看下面的示例



看到這裡應該稍微明白了一點,三維陣列第一個元素地址和第二個元素地址之間確實是差2
但是為什麼減是1呢?
我是這麼想的,&a[0][0][0]就可以假設是指標p1,&a[0][0][1]就可以假設是指標p2,那一減不就是1嗎?
&a[0][0][0]不是這個元素的首地址,而是這個陣列的首地址,指的是這個元素所擁有的這一塊(2個位元組)地址,恩,不曉得我說的對不對,如果不對的話,請在下面評論或者私信我。

這是楊哥的一篇關於指標的部落格:下面這段話的出處
http://blog.csdn.net/morixinguan/article/details/50446419

我們也常聽很多人說,陣列的首地址就是陣列的第一個元素,可以這麼說,但是,它們之間實質是不能等效的,為什麼這麼說?

         陣列的首地址和陣列的首元素的首地址是完成不同的概念,看著名字很像,其實有所區別。陣列名是個左值,但不是可修改的左值,而陣列首元素的首地址,也就是0地址,你可以對它進行賦值,就相當於給陣列的元素賦值。所以陣列的首地址和陣列的首元素的首地址是不相同的概念,請那些所謂的程式設計師不要誤導初學者。(嗯,說的好像就是我這種什麼都不懂的菜雞)