指標和多維陣列(C Primer Plus)解釋
討論最簡單的二維陣列形式:
int array[4][2]={{2,4},{6,8},{1,3},{5,7}};
1. 我們知道,陣列名同時代表陣列首元素的地址。array 是這個二維陣列的名字,array 也是這個二維陣列的首元素的地址。
注意array 這個二維陣列一共有4個元素({2,4},{6,8},{1,3},{5,7}),且每個元素都包含兩個 int 型別的陣列。
所以,首元素的地址為 array=&array[0] 。
2. 元素array[0]本身是包含兩個整數的陣列,因此array[0]的值同其首元素的地址&array[0][0]相同。可以這樣理解:
array[0]是首元素{2,4}的名字,而首元素又是陣列,又陣列名同時代表陣列首元素的地址,所以,array[0]是其首元素的地址,即&array[0][0]。
3. array[0]是一個整數大小物件的地址,因為array[0]是陣列的{2,4}的名字!而array是兩個整數大小物件的地址,因為array以獨立陣列為元素,且每個獨立陣列又包含兩個整數型別的資料。
4. 對一個指標(也即地址)加1,會對原來的數值加上一個對應型別大小的數值。也就是說,array[0]+1會加上一個int型別的大小;array+1會加上兩個int型別的大小。
5. 對一個指標(也即地址)取值,使用*符號或者索引[]符號。因為array[0]是其首元素array[0][0]的地址,
所以*(array[0])代表儲存在array[0][0]中的數值。同理,*array代表其首元素array[0]的值,但是array[0]本身就是一個地址,即&arrray[0][0],因此,*array=&array[0][0]。對這個表示式取值:*(*array)=*&array[0][0]。
總之,array是地址的地址,需要兩次取值才可以得到通常的數值。
簡單程式碼執行:
#include<stdio.h> int main(void) { int array[4][2]={{2,4},{6,8},{1,3},{5,7}}; printf("\tarray=%p,\tarray+1=%p\n",array,array+1); printf("\tarray[0]=%p,\tarray[0]+1=%p\n",array[0],array[0]+1); printf("\t*array=%p,\t*array+1=%p\n",*array,*array+1); printf("\tarray[0][0]=%d\n",array[0][0]); printf("\t*array[0]=%d\n",*array[0]); printf("\t**array=%d\n",**array); printf("\tarray[2][1]=%d\n",array[2][1]); printf("\t*(*(array+2)+1)=%d\n",*(*(array+2)+1)); return 0; }
注意觀察他們地址的變化!!!