這個問題大家應該都碰到過,指標陣列和陣列指標,剛開始看時覺得還是能看懂,但是過些時又搞混了,最後發現還是沒有真正理解。
下面就簡單說說這兩個概念:
一:指標陣列,顧名思義,就是說的首先是乙個陣列吧,然後陣列的元素是指標而已。
說明形式為:type *pointer_array[constant1][constant2]...[constantn];
例如:int *pai[3]; 是乙個陣列,陣列裡的型別是int*型別
由於『*』是自右向左結合,因此從右向左看,首先看到[4]說明是乙個陣列,是乙個包含4個元素的陣列,然後看到『*』,顯然是指標型別,由此可以看出陣列中存放的是指標而不是一般的型別。同理,char *pac[2][3]是包含有6個元素,每乙個元素都是乙個字元型指標。再來說說他們的初始化:
int *pai[3];既然是乙個包含4個整形指標的陣列那麼其對應的將是乙個二維整形陣列,因為乙個整形指標對應乙個一維整形陣列。
那我就用乙個二維整形陣列來初始化它,事實上一般也都是這麼做的,這裡有乙個二維陣列,int arr[3][2]=,,},乙個三行兩列的整形陣列,注意這裡的行必須和你的指標陣列的維數一致,否則是不允許的,不信你可以試試。
這個初始化有很多種選擇,以下只列舉常見的兩中:
第一種也是很好理解的:
for(int i=0;i<3;i++)
pai=arr;
顯然arr是每一行的首位址,相當於乙個一維陣列的陣列名,如是把它送給乙個整形指標pai是理所當然的了。
注意:不能將二維陣列的陣列名賦給指標陣列的陣列名,pai=arr(錯),因為兩者的型別不一致,二維陣列名的型別是指向int型的指標,而指標陣列的的陣列名是指向int *型別的指標。
在c/c++語言中,指標陣列最常用的場合就是說明乙個字串陣列。即說明乙個陣列,它的每個元素都是乙個字串。
二:陣列指標:指向乙個陣列的指標。
說明形式為:type (*pointer_array)[constant1][constant2]...[constantn];
注意這裡的圓括號是必須就將這是由於方括號,較指標說明符「*」的優先順序高,若無此圓括號,編譯器將把上述說明解釋成成了乙個陣列指標。
例如:int (*ap)[2];
這樣就說明了乙個指向包含有2個元素的整形陣列的陣列指標,聽起來確實有點彆扭。不過仔細分析應該還是能理解的,就是說ap是乙個指標,而它指向的物件是乙個指標,注意不要將它和乙個指向乙個整形變數的指標搞混了。
同樣以乙個二維陣列來說明其初始化問題,
int arr[3][2]=,,};注意這裡的列數必須和陣列指標所指的陣列的列數相同。
第一種方法:
ap=arr;
為什麼這裡能這樣將二維陣列名送給ap呢,你可以這樣理解,二維陣列不就可以看成是一維陣列的陣列嗎,而乙個陣列指標它指向的內容就是乙個一維陣列,那麼你就可以把這個陣列指標當做是乙個陣列名,只不過這個陣列裡的元素不是像int,char之型別的,而是乙個陣列,這樣你就可以把它和二維陣列的陣列名聯絡在一起了吧。文筆不行,不知道是否說清楚了。
第二種方法:
ap=&arr[0];
這裡arr[0]其實就是一維陣列的陣列名,將它的位址給ap是很自然的,因為ap本來就是指向乙個一維陣列的。
注意這裡不能這樣初始化:int (*a)[2]=,,};
指標與陣列,指標陣列 陣列指標
int a 10 print n a p,a p a,a print n a 1 p,a 1 p a 1,a 1 a做乙個指標,步長為4,指向乙個元素,a做乙個指標,步長為40,指向乙個維陣列 int b 3 4 print n b p,b p,b p b,b,b print n b 1 p,b 1...
陣列 指標陣列與陣列指標
一 陣列型別 int a 10 printf a d,a 1 d n a,a 1 printf a d,a 1 d n a,a 1 輸出結果 2 陣列元素的首位址是常量,不能修改,這是為了釋放記憶體空間所必需的,否則找不到釋放記憶體空間的首位址了 3 定義乙個陣列型別 定義陣列型別的格式如下 typ...
指標陣列與陣列指標
1.指標陣列 指標陣列中每乙個元素都是乙個指標,也既是存放字串的首位址。所以指標陣列適合處理若干個長度不等的字串。定義的一般形式為 型別說明符 指標陣列名 陣列長度 例如 int p 3 宣告乙個陣列,指標陣列p,由3個int型別指標變數元素組成 從運算子的優先順序分析,由於 的優先順序大於 所以p...