1. 程式人生 > 其它 >簡單理解C語言中指標和陣列的關係

簡單理解C語言中指標和陣列的關係

技術標籤:指標c++c語言陣列

簡單理解C語言中指標和陣列的關係

一維陣列和指標的關係

在通常的認識裡我們認為一維陣列名代表陣列的首地址,當然我們更習慣用一個指標來指向一個一維陣列,這樣做的好處是由於指標是變數可以通過自增自減等操作來完成陣列元素的遍歷,但是陣列名也可以完成這種功能,不同之處是陣列名是常量,其值不能再更改,不能通過自增自減操作實現元素的遍歷。

int a[10]={1,2,3,4,5,6,7,8,9,10};
int *p;
p=a;//p=&a[0]

在上面的定義中可以使用p++來訪問元素,但是不能使用a++,而只能使用a+i來訪問元素。

二維陣列和指標的關係

在二維陣列中我們也希望用一個指標變數來指向,這樣的操作好像不如一維陣列來的方便,例如下面的定義是很誤導我們的。

int a[][5]={1,2,3,4,5,6,7,8,9,10};
int *p;
p=a;//此處會報錯

上面的程式碼在Visual Studio中提示的錯誤資訊是這樣的:不能將 “int (*p)[5]” 型別的值分配到 "int * "型別的實體 。這裡 "int (*p)[5]"顯然是指標陣列,其本質上是陣列,不過陣列中存放的是指標變數,"int *"顯然是指標型別,這兩個在數量上就不匹配,顯然指標陣列中包含的元素要比單個指標變數多,再來分析上面的程式碼 “int *"顯然指的是int *p,那麼"int (*p)[5]"則指的是a[][5],也就是說應當用指標陣列才能和a[][5]匹配,於是下面的定義才是合法的。//此段的p是為了顯示而加上去的,閱讀時可以去掉

	int a[][5] = { 1,2,3,4,5,6,7,8,9,10 };
	int (*p)[5];
	p = a;//或者p=a[0]

該怎麼去理解二維陣列呢?像很多教科書上寫的一樣,我們可以把二維陣列看成是多個一維陣列的集合,於是便有:
二維陣列的劃分
在上面的劃分中我們都能夠看到的是後一個等號,而對於前一個等號,我們可以認為這也是一個數組,只不過這個數組裡只有兩個元素,不過這兩個元素都是一維陣列,這樣一來陣列a確實應當用一個指標陣列來描述而不能簡單用一個指標變數來描述。前一個等號兩端內容
還可以這樣認為,由於上面由a[2][5]過渡到後面的具體元素a[i][j]需要兩個等號來完成,因此可以認為陣列名是一個二級指標,通過下面的程式碼輸出結果也可以驗證。

驗證陣列名a看成是二級指標
以上就是本人粗略的理解,水平有限,還望大佬指正。