第五章 指向陣列的指標

2021-06-01 10:45:52 字數 1994 閱讀 3701

講到第五章了,陣列兩個字還離不開我們的左右,陣列的內容也真多,另一方面也因為陣列與指標的關係的確非常密切。

通常,對於int a[8][9]這個二維陣列,我們可以這樣定義乙個指向它的指標:

int (*p)[9];

這個宣告的形式跟人們所熟悉的int *p的形式大相庭徑,初學者通常會感到迷惑,不理解的地方大致有四個:

1。為什麼會以這種形式宣告?

2。(*p)應該如何理解?

3。為什麼必須把第二維顯式地宣告?

4。為什麼忽略第一維?

下面我們就一起逐個討論這四個問題:

1。這種形式是c標準的宣告語法規定的,由於本章不是對標準的解釋,只是對標準的應用,因此筆者盡量以簡潔的方式解釋這個宣告,詳細的討論將在第七章進行。c標準的宣告包含了兩部分:

宣告:宣告說明符  初始化宣告符表opt      (opt的意思是可選)

在宣告說明符裡面有一項型別說明符,int就是這種型別說明符。而初始化宣告符表裡面的其中一種形式,就是:

直接宣告符 [常量表示式opt]

(*p)[9]就是這種直接宣告符加的形式。

2。p左邊的*在這裡不是取值運算子,而是乙個宣告符,它指出p是乙個指標。而()括號是不能去掉的,如果去掉了,由於運算子優先順序比*高,p就會先跟結合,這樣p就變成了乙個指標陣列,而不是指向陣列的指標。

題外話:

*p還有一種用法,就是當*是取值運算子的時候,*p是乙個左值,表示乙個變數,為什麼*p是乙個變數呢?也許有人會說,因為int i, *p=&i嘛,其實這是結果不是原因。嚴格來說,i只是乙個變數名,不是變數,在編譯器的符號表裡面,變數名是乙個符號位址,它所代表的位址值是它指向的那段記憶體單元的位址,真正叫變數的是那段記憶體單元,懂彙編的朋友能很容易地區分出來,在彙編裡面,可以這樣定義乙個變數名:

varw  dw  10,20

varw就是乙個變數名,它在彙編裡面是乙個位址,代表了10所在的記憶體單元這個變數。由於p被初始化為&i,*p指向i所代表的那段記憶體單元,因此說*p是乙個變數。把i稱為變數是一種習慣上的統稱。

3。定義乙個指標的時候,首先必須定出指標的型別,由於這是乙個指向陣列的指標,如果陣列的元素的型別定下來了,那麼這個指標的型別也就定下來了。前面說過,c語言的多維陣列實質上是陣列的巢狀,那麼所指向陣列的元素必定具有陣列型別,也就是說,這個陣列的元素是乙個具有6個int元素的陣列,因此,p定義的時候,必須指定第二維的上界,這樣才能把p的型別定下來。

4。有這種疑問的人已經犯了乙個錯誤,沒有分清楚什麼是指標,什麼是陣列,以陣列的思維模式來看待這個指標p。定義乙個陣列(非static)的時候,需要在棧中靜態分配一塊記憶體,那麼就需要知道這塊記憶體的大小,因此定義陣列時需要確定各維的上界。而這裡只是定義乙個指標而已,對於乙個指標的定義,需要知道的是它所指向物件的型別,並不需要知道物件的大小,這是多餘的。因此,所有指向陣列的指標的第一維被忽略。

以上介紹了如何宣告乙個指向二維陣列的指標,類似地,對乙個指向n維陣列的指標也可以用同樣的方法來宣告,如下:

int (*p)[x2][x3]......[xn];

同樣可以忽略第一維,而其它維必須指定上界。

最後再討論一種很常見的對多維陣列的錯誤理解,有些人常常會以為,二維陣列就是二級指標,這種錯誤的根源,來自於可以把乙個二級指標int **p以p[i][j]這種形式使用。首先把陣列稱為指標就是錯誤的,第一章筆者已經說明了陣列名是位址,不能理解為指標。第二,並非能以p[i][j]這種形式使用,那麼p就是乙個二維陣列了,c標準對陣列引用的規定,並沒有指定陣列引用時運算子的左邊必須是陣列名,而可以是乙個表示式。第三,這是一種「巧合」,歸根到底是由於c語言的陣列實現是陣列的巢狀同時c標準把運算子轉換為類似*(*(a+i)+j)這樣的等價表示式造成的,那兩個取值運算子「恰好」可以用於乙個二級指標。第四,p與p[i]並不具有陣列型別,sizeof(p)和sizeof(p[i])的結果只是乙個指標的大小4位元組。而對於乙個真正的陣列,p與p[i]都是具有陣列型別的位址。

實際上,int **p只是乙個指向一維指標陣列的指標,而不是指向二維陣列的指標。同樣地,對於n級指標,都可以看作乙個指向一維指標陣列的指標,這個指標陣列的元素都是n-1級指標。

第五章 陣列

陣列就是一組相同型別的變數,它們往往都是為了表示同一批物件的統一屬性,如乙個班級所有同學的身高 全球所有國家的人口數等。陣列可以是一維的,也可以是二維或多維的。使用一維陣列時,一般是從0開始編號,s i 就表示第i 1個同學的身高,i稱為下標變數。例如讀人50個同學的身高,語句就可以這樣書寫 for...

第五章 陣列

學習目標 1 理解陣列含義 2 學會一維陣列 二維陣列解決實際問題 3 掌握各種元素排序等 知識點梳理 重難點和基本知識 一 一維陣列的定義 陣列的概念 按順序排列的一組同種型別的變數構成的集合。乙個陣列在記憶體中佔一片連續的儲存單元 1 一維陣列的定義 定義一維陣列的格式 型別識別符號 陣列名 常...

第五章 陣列array

所謂陣列,是指將那些具有相同型別的 數量有限的若干個變數通過有序的方法組織起來的一種便於使用的形式。陣列屬於一種構造型別,其中的變數被稱為陣列的元素。陣列元素的型別可以是基本資料型別,也可以是特殊型別和構造型別。表示長度 下標從0 開始 int float,double,char 要賦值,初始化 簡...