指標陣列和陣列指標

2021-08-18 23:05:59 字數 3296 閱讀 9142

(1)陣列在記憶體中的表示

建立乙個陣列就是在記憶體裡面開闢一塊連續的空間,比如int a[4];就是在記憶體裡面開闢了乙個大小為4*sizeof(int)位元組的記憶體空間。二維陣列是特殊的一維陣列。

先來看一段**:

[cpp]

view plain

copy

void

main()  

;//這是乙個2*2的二維陣列

int(*p)[2];

//陣列指標

p=a;//令p指向陣列a

} 注意到**中這句話:int (*p)[2];這裡的p是乙個陣列指標變數。

a中各個元素在記憶體中是這樣存放的:

(2)理解陣列名和陣列指標變數

ok,現在我們思考a,a[0],a[1],p,a+1,a[0]+1,p+1到底是什麼,思考3秒鐘:

分析:a是乙個陣列名,型別是指向一維陣列的指標,不是變數,a的值是指標常量,即不能有a++或者a = p這些操作。a指向這塊連續空間的首位址,值是&a[0][0]。

a[0]是一維陣列名,型別是指向整型的指標,值是&a[0][0],這個值是乙個常量。

a[1]是一維陣列名,型別是指向整型的指標,值是&a[1][0],這個值是乙個常量。

p是乙個陣列指標變數,指向一維陣列的指標變數,值是&a[0][0]。可以執行p++;p = a等操作。

a+1表示指向下一行元素,也可以理解為指向下乙個一維陣列。

*(a+1)是取出第一行的首位址。

a[0]+1是指向第0行第1個元素,也可以理解為指向一維陣列a[0]的第乙個元素。

p+1同a+1

*(p+1)同*(a+1)

雖然a跟a[0]值是一樣,但型別不一樣,表示的意義不一樣。

通過分析就不難理解為什麼*(*(a+i)+j)和a[i][j]等效了。

[cpp]

view plain

copy

#include

#define m 2

#define n 3

intmain()  

;  int

*start=&a[0][0];  

int* 

const

end=start+m*n;  

for(;start!=end;start++)  

printf("%-5d"

,*start);  

putchar('\n'

);  

return

0;  

}理解這段**,用指標遍歷乙個二維陣列,是不是很像c++標準庫裡面vector的迭代器。注意這裡只用了乙個for迴圈,這也可以說明二維陣列其實就是特殊的一維陣列。

(4)陣列名與陣列指標變數的區別

從(2)中的分析中得出陣列名是指標,型別是指向元素型別的指標,但值是指標常量,宣告陣列時編譯器會為宣告所指定的元素數量保留記憶體空間。陣列指標是指向陣列的指標,宣告指標變數時編譯器只為指標本身保留記憶體空間(即儲存任何乙個位址所需要的空間,32位機器上是4個位元組,64位機器上是8個位元組)。

看看這個**:

[cpp]

view plain

#include

void

main()  

;//這是乙個2*2的二維陣列

int(*p)[2];

//陣列指標

p=a;//令p指向陣列a

printf("%d\n%d\n"

,sizeof

a,sizeof

p);  

} 猜一猜輸出是什麼?

困惑了嗎?為什麼結果會是這樣的呢,讓我們先初步了解一下sizeof關鍵字吧,下面是msdn上sizeof的說明:

注意到說明中的紅色字型,當sizeof用於變數時返回這個變數占用的實際空間的大小。當sizeof用於陣列名時,返回整個陣列的大小(這裡的大小指占用的位元組數)。p是乙個指標變數,這個變數占用四個位元組。而a是陣列名,所以sizeof a返回陣列a中的全部元素占用的位元組數。

了解了sizeof,猜猜下面這段**輸出什麼

[cpp]

view plain

copy

#include

void

main()  

;//這是乙個2*2的二維陣列

int(*p)[2];

//陣列指標

p=a;//令p指向陣列a

printf("%d\n%d\n"

,sizeof

(a+1),

sizeof

(p+1));  

printf("%d\n%d\n"

,sizeof

(a+0),

sizeof

(p+0));  

}執行結果:

從結果中看出,a在做+運算時是轉化成了指標變數,此時a+i的型別是乙個指標變數,而不是乙個陣列名。但a[i]是乙個一維陣列的陣列名,sizeof(a[0])的值是8。 

現在再來看一段**:

[cpp]

view plain

copy

#include

void

f(int

a[2])  

void

main()  

;//這是乙個2*2的二維陣列

printf("%d\n"

,sizeof

a);  

f(a);  

}再猜一下輸出是什麼?

是不是又有點困惑呢?

解釋:這是因為傳參的時候陣列名轉化成指標變數,注意到函式f中f(int a[2])這裡並不需要指定二維陣列的長度,此處可以改為int (*a)[2]。所以傳過來的就是乙個陣列指標變數。這樣明白了吧!

總結:陣列名的型別是指向元素型別的指標,值是指標常量。(a+1)的型別是乙個指標變數。把陣列名作為引數傳遞的時候實際上傳遞的是乙個指標變數。sizeof對變數和陣列名操作時返回的結果會不一樣。陣列指標是指向陣列的指標,其值可以是變數。

(1)認識指標陣列

乙個存放int型別的陣列稱為整型陣列,那麼存放指標的陣列就叫指標陣列。

[cpp]

view plain

copy

#include

void

main()  

斷點除錯分析:

此例陣列p就兩個元素,p[0]是指向i的指標,p[1]是指向j的指標。這兩個指標都是int型指標,所以p是存放int型指標的陣列。sizeof(p)返回陣列占用的總空間,所以程式輸出是8

(2)指標陣列用法舉例

來自《the c programming language》的乙個例子,對字串進行排序,看了下面這個例子,相信你就體會到了指標陣列的好處了。

指標陣列和陣列指標

有關陣列指標和指標陣列容易混淆,本文舉例說明兩者的區別,並加以分析。基本概念 指標 inta 1 int p a 指標的指標 int p2p p 簡單陣列 intb 20 指標陣列 int p 10 指標陣列,含有10個指標元素,即每乙個元素都是乙個指標 陣列指標 int p 10 這個指標用來指向...

指標陣列和陣列指標

理解這兩個概念,當從語言學的語法角度開始,定語 名詞,即 的 語句。指標陣列 指標的陣列 陣列指標 陣列的指標。一 指標陣列 元素為指標的陣列 顧名思義,就是說的首先是乙個陣列吧,然後陣列的元素是指標而已。說明形式為 type pointer array constant1 constant2 co...

指標陣列和陣列指標

該文時自己對指標陣列用法的一點總結,還望高手指點不足原文如下 由於以前對指標陣列不太明白,所以自己寫了 乙個小的測試程式來驗證了自己的猜測,先總結如下 指標陣列,由名字就可以知道的該陣列中的成員都是為指標的。其定義的方法為 char p 5 該初定義乙個包含5個char 型別的陣列的指標,由於p本身...