陣列指標與指標陣列

2021-07-09 06:44:21 字數 3015 閱讀 7469

一:前言
陣列指標和指標陣列是兩個很容易讓初學者感到模糊的概念,同時也是重點,所以希望讀者能耐心閱讀,仔細理解。

那麼,什麼是陣列指標,什麼又是指標陣列呢?

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...