一:前言陣列指標和指標陣列是兩個很容易讓初學者感到模糊的概念,同時也是重點,所以希望讀者能耐心閱讀,仔細理解。
那麼,什麼是陣列指標,什麼又是指標陣列呢?
int(*p)[2];//陣列指標
int* p[2];//指標陣列
在繼續分析兩者的區別前,需要讀者了解3個問題:
1.二維陣列是特殊的一維陣列。
int a[2][2];
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
cout << &a[i][j] << endl;
我們發現輸出的位址是連續的,很簡單,不作解釋。
2.陣列位址。
int a[2];
int aa[2][2];
監視下型別圖為:
a是一維陣列的陣列名,值是乙個位址,大小等於首元素位址,注意a不是變數,a[ 0 ]和a[ 1 ]才是變數,也就是不可以有a++之類的操作,型別是int[ 2 ](很多人認為a是指標型別int*,嚴格來說,不對,關於這點在下面會講)。
&a是一維陣列的陣列位址,值是連續兩個int元素的位址,只不過大小也等於首元素大小,型別是int[ 2 ]*。
aa是二維陣列的陣列名,值是乙個位址,大小等於首元素位址,同樣aa不是變數,型別是int[ 2 ][ 2 ]。
&aa是二維陣列的陣列位址,也就是連續四個int元素的位址,大小也是等於首元素位址,型別是int[ 2 ][ 2 ]*。
aa[ 0 ]是二維陣列的第一行小陣列的陣列名,這裡可以看做是a,型別和a是一樣的。
&aa[ 0 ]是二維陣列的第一行小陣列的陣列位址,也就是aa[ 0 ][ 0 ]和aa[ 0 ][ 1 ]的位址。
3.陣列型別可以轉化為指標型別。
int a[2];
int *p;
p = a;
int aa[2][2];
int(*pp)[2];
pp = aa;
在vs除錯下,監視變數圖為:
我們知道,運算子=成立的前提是左右型別相同或者右型別可以轉化為左型別。
在上圖,a和p的型別是不同的,但是a=p卻是成立的,同樣的,aa=pp也是成立的。這是因為array type 可以轉化為pointer type。即int[ ]轉化為int*,int[ ][ ]轉化為int[ ]*。如何使乙個陣列名退化成指標呢?只需對其進行數值計算即可,例如,a+0,aa+0。(其中a[0]等價*(a+0),aa[0]等價*(aa+0))
這也就解釋了上面我所說的,a不是int*型別,只是可以轉化而已,可以轉化並不代表a就是int*型別的。打個比方,int和short可以轉化,但是int不是short,只是可以轉化而已。a的型別就是int[ 2 ],描述為a是乙個陣列,由兩個int組成。
二:陣列指標
int a[2];
int aa[2][2];
int(*p)[2];
p = a;//error
p = &a;//right
p = aa;//right
p = aa[0];//error
p= &aa[0];//right
int bb[2][3];
p = bb;//error
p是乙個陣列指標,型別是int[2] * ,含義是指向乙個連續兩個int元素的位址,也就是陣列位址,陣列位址在上面講過,就是連續元素的位址,值為第乙個元素位址。
p = a是錯誤的,因為a的型別是int[2],p的型別是int[2] * 。
p = &a是正確的,因為&a是陣列位址。p = aa是正確的,因為array type 可以轉換為pointer type。
p = aa[0]是錯誤的,因為aa[0]的型別是int[2],和a的型別一樣。
p = &aa[0]是正確的,這個和p = &a是一樣的道理。
p = bb是錯誤的,因為p是指向連續兩個元素的位址,而bb是3個,無法轉化。
關於陣列指標的應用,應該就是傳遞引數的時候了,看下面的**:
int a[2][3] = ;
void func(int(*p)[3])
func(a);//2
三:指標陣列指標陣列就是存放指標變數的陣列。這個陣列裡的每個元素儲存的都是位址。 這個很好理解。
int * p[2];//指標陣列
int a[2] = ;
p[0] = &a[0];
p[1] = &a[1];
關於指標陣列的應用,舉乙個來自《the c programming language》的乙個例子,對字串進行排序,看了下面這個例子,相信你就體會到了指標陣列的好處了。
四:總結指標陣列:乙個單純的陣列,陣列裡儲存的是指標變數。(寫法例如int * p[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...