(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本身...