1. 程式人生 > >指標和多維陣列(C Primer Plus)解釋

指標和多維陣列(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;
}


注意觀察他們地址的變化!!!