一、多維數組地址和指針的關系int arr2[4][2]={{1,2},{3,4},{5,6},{7,8}};
printf("arr2=%p,&arr2[0]=%p,arr2[0]=%p,&ar2r[0][0]=%p\n",arr2,&arr2[0],arr2[0],&arr2[0][0]);
arr[0][0] (1) |
arr[1][0] (3) |
arr[2][0] (5) |
arr[3][0] (7) |
arr[0][1] (2) |
arr[1][1] (4) |
arr[2][1] (6) |
arr[3][1] (8) |
上面的程序的結果輸出竟然都一樣。為什么呢?
首先 arr2 代表的是arr2數組的首地址,所以 arr2的值和 arr2第一個子元素arr2[0]的地址相同,即 &arr2[0];
arr2[0]是含有兩個整形元素一維數組的首地址,即&arr2[0][0]的值。
簡單的說:arr[0]是一個整數大小對象的地址,arr2是兩個整數大小對象的地址。因為整數和兩個整數組成的數組開始于同一個地址,所以 arr2 和 arr2[0] 具有相同的數值。
二、指針(地址)運算和多維數組的關系printf("arr2+1=%p,arr2[0]+1=%p\n",arr2+1,arr2[0]+1);
現在我們知道,arr2 和 arr2[0]具有相同的數值,但是arr2+1和arr2[0]+1為什么數值不一樣呢?這是因為,arr2指向的對象大小是兩個int,兒arr2[0]所指向的大小是一個int。所以arr2+1的值要比arr2[0]+1的值多一個int大小。
三、使用*對多維數組取值因為 arr2[0] 是 arr2[0][0]的首地址,所以 *(arr2[0])代表存儲在arr2[0][0]的值。同樣,arr2是arr2[0]的首地址,*arr就是 arr2[0]的值。但是 arr2[0]也是一個地址,即&arr2[0][0],因此*arr2是 &arr2[0][0]。所以 *&arr2[0][0] 等價于 **arr2。*&arr2[0][0] 可以簡化為 arr2[0][0]。所以 arr2[0][0]==**arr2。
簡而言之:arr2是地址的地址,所以需要經過兩次取值才能取到具體的數值。
學完這個知識點,才發現在指針確實很難懂。