《c和指針》中有一道關於多維數組的題目,引用如下:
int array[4][2][3][6];
請問 array , &array+1,array+2, array[2]-1, array[0][1][0]+2 的值和類型。在回答之前首先這個問題請思考一下,指針和數組在存取時的方式差異;
int arr[10];
int *p=arr;
在大多數情況下,arr[3] , *(arr+3) , p[3] , *(p+3) 是沒有差別的,都可以存取arr中的第4個元素。然而,對編譯器來說,這完全不同的執行代碼。
數組和指針的標準書寫方式:
arr[3] 是從 array的位置開始,移動 3個 元素的大小;
*(p+3)是讀出 p的值,加上 3*sizeof(元素),取出對應內存字符。
注意到此處 “+3”的實際大小與元素的大小相關,即就是對應不同的權重:
array 和 &array
雖然兩個的值相同,但是array代表數組的地址,&array 就是取整個數組的首地址,
不同的地方在於,數組名+1和數組名取地址+1,前者是第二個元素的地址,後者是數組越界後第一個元素地址。
此題的答案
array 指數組首元素的地址,即第一個三維數組的大小,類型爲(*a)[2][3][6];
&array+1 對整個數組取地址加一個 array數組大小;array+2 數組中第三個三維數組的地址,類型爲(*a)[2][3][6];
array[2]-1 數組中第二個三維數組中最後一個二維數組的地址,類型爲(*b)[3][6];
array[0][1][0] 數組中第一個三維數組中第二個二維數組中第一個一維數組,類型爲(*c)[6];
因此,在進行多維數組運算時,首先將多維數組看成低一維數組,“+”“-”低一維數組的大小。
參考文獻:對多維數組的理解 http://blog.csdn.net/zhengqijun_/article/details/52015950
指針與數組的區別 http://blog.163.com/yang_ping111/blog/static/71885052200841825710944