多維陣列
1.對兩維陣列的理解
對於float rain[5][12]
,把它理解為有這樣乙個陣列,它的可以表示為
rain[5],
而其中的每乙個元素(總共有
5個)是另外乙個陣列,這個陣列有12個
float
型別的資料。
所以rain
的首元素
rain[0]
是乙個包含12個
float
數值的陣列,且
rain[1],rain[2]
等等也是如此。換言之,
rain
是包含5
個元素(每乙個元素又是包含12個
float
數的陣列)的陣列。
2.對於兩維陣列的位址計算
根據剛才的分析,可以得出以下結論。
如果有陣列
int a[3][3], 在32
位機子上執行,且假設
a的位址為
2000,
那麼a[1]
的位址就是
2012
(2000 + 4 * 3
),而且
a[1]
的位址就是
a[1][0]
的位址,正如
a的位址就是
a[0][0]
的位址(陣列名其實就是該陣列首元素的位址)。
另外,a[2][1] == *(*(a + 2) + 1) ,
理解兩維陣列的關鍵是
a[1]
是個int *
型指標,因為
a[1]
是指向其首元素
a[1][0]
的指標,而
a[1][0]
是int *
型。3.
如何將陣列作為引數傳遞到函式
處理陣列的函式其實使用指標指標作為引數的。在c中,
a[i]
在後台就是被解析為
*(a + i)
。(1)
一維陣列
方法一,如果有
float a[3],
那麼對應的函式原型至少為
int sum(float * a, int n),
其中float * a
是因為以後將會傳入陣列名,而陣列名就是陣列第乙個元素的位址,所以要與之匹配,對於這個例子,陣列的第乙個元素是
float
型,所以如果傳入引數的話就應該是
float*. int n
是為了傳入這個陣列的大小,防止函式內越界。
方法二,如果有
float a[3],
那麼對應的函式原型至少為
int sum(float * a, float * end)
呼叫如下
sum(a , a + 3)
。然後需要在
sum中做的事情是判斷,注意在做
while
的時候的判定條件是
while ( a < end),
其中千萬不能用等號,因為
a的最後乙個元素為
a[2]
。(2)
兩維陣列
利用指標陣列(形似
int (*p)[2]),
函式原型寫成
int sum( int (*p)[2], int rows)
。其中要已知兩維陣列的列數為
2,行數作為乙個引數傳進
sum.
4.指標可以使用的基本操作
(1)賦值
(2)求值(
*操作符)
(3)取指標的位址(
&操作符)
(4)將整數加給指標(包括自加)
(5)從指標中減去乙個整數(包括自減)
(6)求差值——通常對分別指向同乙個陣列內兩個元素的指標求差值,以求出元素之間的距離。
(7)比較——前提是兩個指標具有相同的型別
5.對指標的加減法運算在c
中,對乙個指標加
1的結果是對該指標增加
1個儲存單元(即它所指向的物件的位元組大小)。比如說有
int * p. 如果p
的位址是
2000
,那麼++p
的結果是
2004
(在32
位機子上,
int占用
4個位元組)。
對於陣列而言,由於這個特性,位址會增加到下乙個元素的位址。
於是,如果有
double dates[10],
則顯然(date + 2) == &dates[2]
,而且*(dates + 2) == dates[2]
注意,這裡是對指標的加減法,雖然
dates
代表dates[0]
的位址,但是它畢竟不是指標,而是位址的常量。所以語句
dates++
是違法的。
6.關於
const int * p
與int* const p
前者const
了int *, 即p
所指向的位址是不能夠被改變了,但是這個位址所代表的內容卻是可以改變的。後者
const了p
,即p的內容(*p)
是不能夠被改變了,但是
p所指向的位址卻是可以轉換的。
7.指標陣列與陣列指標
關鍵在於
的優先順序高於
*(1)
int (*pz)[2]
pz是乙個指標,指向乙個
int[2]
的匿名陣列。
(2)int * pz[2]
pz是乙個陣列,他有
2個元素,而且每乙個元素是
int *
型。8.
指標的相容性
指標賦值非常嚴格,只能夠賦給相同型別的值。
例如有如下宣告:
int * pt;
int (*pa)[3];
int ar1[2][3];
int ar2[3][2];
int **p2
那麼有如下結論
pt = & ar1[0][0] //
成立pt = ar1[0] //
成立,因為
ar1[0]
就是int *
型指標。可以這樣理解。
&ar1[0][0] == *(ar1 + 0) + 0
pt = ar1 //
非法,因為
ar1是指向由3個
int值構成的陣列的指標,說白了其實是乙個
int[3]
型的指標,而不是
int *
型指標。
ar1是指向
ar1[0]
的指標,而
ar1[0]
是乙個int[3]
,所以ar1
是int[3]
型指標。
pa = ar1 //
成立,理由見上
pa = ar2 //
不成立,
因為pa
是int[3]
型指標,而
ar2是
int[2]
型指標p2 = &pt //
成立*p2 = ar2[0] //
成立,因為
ar2[0]
是int *
型指標,
因為ar2[0]
是指向其首元素
ar2[0][0]
的指標p2 = ar2 //
不成立,p2是
int **,
而ar2
是int[2]
型指標。
C 指標陣列與陣列指標
說實話,c語言真的很讓人蛋疼,它不像物件導向的語言,我們重心在設計程式上。而使用c語言,你不僅要考慮程式的設計,你還要考慮很多他的使用細節,不然一不小心你怎麼死的都不知道。但是,個人感覺,c語言的魅力是其他任何語言都比不了的!繼續看。陣列指標 範例 typedef int aint5 5 typed...
C 指標陣列與陣列指標
陣列指標 也稱行指標 陣列指標 a pointer to an array,即指向陣列的指標 定義 int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。如要將二維陣列賦給一指標,應這樣...
指標陣列與陣列指標 C
關於陣列指標 1 對於二維陣列,初始化時,必須指定乙個引數 int a 3 int a 這樣是不允許的,因為要確定指標移動一步要走多遠。對於一位陣列int a 這樣可以。也就數說只有乙個引數位置可以不用設定引數。2 int p 3 必須加上小括號,這代表乙個指向陣列的指標,數字3,代表每一列有三個數...