C 陣列與指標

2022-05-14 12:14:40 字數 3775 閱讀 8469

多維陣列

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,代表每一列有三個數...