C語言 陣列指標 和 指標陣列 都是啥跟啥?

2021-09-02 20:39:38 字數 2391 閱讀 8238

相信學習過c語言的童鞋,一定被這2個東西折騰過吧?究竟它們都是何方神聖呢?帶著這個問題,筆者想通過本文給你乙個清晰的答案。通過閱讀本文,你將了解到以下內容:

從c語言的語法上理解,陣列指標的表示形式為:

//定義乙個一維陣列

int a[3];

//定義乙個指標,指向一維陣列的首位址

int *q = a;

//定義乙個3行4列的二維陣列

int b[3][4];

//定義乙個陣列指標,它指向二維陣列的首位址

int (*p)[4] = b;

從陣列指標的形式上看,因為()運算子擁有最高優先順序,所以整個語句優先被解釋成乙個指標;接著,這個指標再指向另乙個陣列的首位址,[x]接上該陣列的列數,即得到如上的陣列指標的定義。

經過這個例子,我們可以看到,陣列指標一般用於表達多維陣列,對比起多維陣列的表示,採用陣列指標的形式可以在一定程度上理解難度減小了。比如,有了如上的陣列指標定義後,這裡b是個二維陣列的陣列名,相當於乙個二級指標常量;p是乙個指標變數,它指向包含5個int元素的一維陣列,此時p的增量以它所指向的一維陣列長度為單位;*(p+i)是一維陣列b[i][0]的位址;*(p+2)+3表示b[2][3]位址(第一行為0行,第一列為0列),*(*(p+2)+3)表示b[2][3]的值。

【指標陣列】,從字面意思上理解,它就是乙個陣列,只不過「指標」是用於修飾「陣列」的,所以合起來理解就是:【乙個陣列元素存放的是指標的陣列】。

從c語言的語法上理解,【指標陣列】的定義形式如下所示:

//定義乙個char *的指標陣列

char *p[5];

這裡,它表示的含義是,乙個由5個元素組成的一維陣列,每個陣列元素都是乙個指標(位址)。訪問陣列的元素,我們都是採用 陣列名[陣列下標] 的形式訪問的,那麼【指標陣列】也不例外,訪問第乙個元素,則是p[0];同理,p[2]表示的是第3個指標。

從字面上看,確實很容易混淆兩者的概念;我們理解的時候,需要注意名詞誰先誰後。一般來說,在前面的名詞是用於修飾後面的名詞,而後面的名詞決定了整個片語的性質。

【陣列指標】:陣列修飾指標,它的本質是乙個指標;一般這個指標指向乙個二維陣列,形式為: int (*p)[m]。

【指標陣列】:指標修飾陣列,它的本質是乙個陣列;這個陣列裡面的元素,存放的都是指標,形式為: int *p[m]。

如上定義中,第乙個m表示二維陣列的列數,第二個m表示的指標陣列(一維陣列)的元素個數。

資料訪問方面:

這兩個概念不但容易混淆,而且在使用過程中也是十分容易出錯,曾經筆者在【指標陣列】上摘過跟頭。現將出錯的教訓分享給大家:

比如有乙個指標陣列的定義:

char *p[5];
假設在程式設計平台上,乙個指標所占用的位址空間是4個位元組,即sizeof(char *) = 4;那麼如果使用sizeof(p)去求這個指標陣列所占用的位址空間時,求得的大小是4*5=20;而每個元素都是char *型別,所以求得指標元素的個數為: 20 / 4 = 5。

於是,我們得出乙個公式,求指標陣列的元素個數:

//直接求得指標陣列p的元素個數

cnt = sizeof(p) / sizeof(p[0]);

//很多時候,我們會定義乙個巨集來表示,形式如下:

#ifndef array_size

#define array_size(a) (sizeof(a) / sizeof(a[0]))

#endif

//使用array_size巨集求指標陣列p的元素個數

cnt = array_size(p);

假設有以下2個指標陣列的定義:

const char *p1 = 

;const char *p2 =

;

如果你不仔細看,你可能覺得p1和p2的定義是一致;仔細一看,原來p2中少了2個分號;而這2個分號一少,直接就導致p2的最終被編譯器識別成的定義為:

//最終被識別的定義

const char *p2 =

;

看到區別了嗎?由於分號的缺失導致前後相鄰的字串被結合在一塊,被連線成乙個更長的字串,而這種【拼接】是編譯器自動識別完成的,它不會提示任何錯誤,因為在它看來根本就不是錯誤。對使用者而言,這樣定義一改變,原本本應該為5個元素的字串陣列,就變成了3個字串的陣列,這簡直就是災難啊!!!

以上就是筆者對【陣列指標】和【指標陣列】的實踐,得出的切實理解,希望能夠幫助大家更近一步地理解它們。以上提及觀點,均為筆者本人的觀點,如有紕漏之處,還望指正。感激不盡。

C語言 指標陣列和指標陣列

本質是陣列 只不過呢,它裡面存放的資料型別不是int,也不是char這類基本型別,而是乙個指標型別,說白了就是位址,所以叫指標陣列!記住 是存放指標的陣列!int p n 本質是指標 只不過是指向乙個陣列的指標,也稱之為 行指標 int p n p是乙個指標,指向乙個int型別的一位陣列,這個一位陣...

C語言中陣列指標和指標陣列

如果看這兩個概念的英文翻譯可能會更容易理解 陣列指標 pointer to array 指標陣列 a array of pointer 顧名思義,陣列指標就是乙個指標變數,該變數指向乙個陣列。而指標陣列就是乙個陣列,這個陣列的元素都是指標,即每乙個元素都可以當成乙個指標變數使用。下面給出兩者的定義和...

C語言 指標陣列和指標陣列 函式指標和指標函式

在c語言中最令然頭疼的莫過於指標 特別是指標和陣列符號一起出現的 傻傻搞不清楚的原因主要在於運算子的優先順序沒有搞清 指標的運算子 陣列運算子,函式運算子 陣列元算符 運算優先順序和函式運算子 或者說強制改變運算順序符號 都是位於第一優先順序的 而我們的指標運算子則是第二優先順序 所以當出現 int...