C語言 陣列指標和指標陣列的用法 區別

2021-10-07 18:27:29 字數 2126 閱讀 1939

2.指標陣列

陣列指標和指標陣列,從字面上區分的方法就是:本質看最後兩個字。例如陣列指標的本質就是乙個指標,乙個指向陣列的指標;而指標陣列的本質就是乙個陣列,乙個成員都是指標的陣列。

陣列指標,即指向乙個陣列的指標。可以指向一維陣列,也可以指向二維陣列(三維及以上陣列一般不用)。

int

(*p)

[n]=

null

;p = 陣列名;

//當陣列是一維陣列時,直接寫陣列名編譯器會警告,但是執行正常。寫成「&陣列名」不會警告。對於二維及以上陣列,直接寫陣列名不會警告。

解析:

型別說明符 (*指標變數名)[長度]。

其中「型別說明符」為所指陣列的資料型別。* 表示其後的變數p是指標型別,它指向的物件是乙個整體,即一維陣列(不能拆開此陣列)。

【注1】

首先 運算子[ ] 的優先順序比 * 高,雖然在優先順序表中 [ ] 的優先順序最高,其次是 ( ) 。但是 ( ) 有強制結合的功能,所以這裡p是和*結合的,而不是。

【注2】

當數值指標指向一維陣列時,n是一維陣列元素的個數。

當數值指標指向二維陣列時,n是二維陣列的列數,即按行拆分成一維陣列後,一維陣列的個數。

【注3】

陣列指標也叫「行指標」,原因是陣列指標指向的陣列不管是一維陣列,還是二維陣列,指標變數p指向的都是行。

【例】用「陣列指標」分別指向並遍歷一維陣列和二維陣列的所有元素。

#include

intmain

(void);

int b[3]

[4]=

;int

(*p1)[5

]=null

;int

(*p2)[4

]=null;

p1=a;

//會警告提示指標型別不匹配,但是可以執行正常,應該是c隱式進行型別轉換。寫成 p1=&a;無警告無錯誤

p2=b;

printf

("遍歷輸出一維陣列元素\n");

//通過陣列指標來遍歷輸出一維陣列a的元素

for(i=

0;i<

5;i++

)printf

("\n");

printf

("遍歷輸出二維陣列元素\n");

for(i=

0;i<

3;i++

)printf

("\n");

}return0;

}

執行結果:

在上例中,陣列指標p2指向二維陣列b。

下面探索一下如何使用陣列指標 p2 來訪問二維陣列b中的每個元素。

陣列指標p2指向二維陣列 b 的開頭,也即第 0 行;p2+1前進一行,指向第 1 行。

*(p2+1)表示取位址上的資料,也就是整個第 1 行資料。注意是一行資料,是多個資料,不是第1 行中的第0個元素。

*(p2+1)+1表示第 1 行第 1 個元素的位址。怎麼理解?

*(p2+1)單獨使用時表示的是第1行整體資料,放在表示式中會被轉換為第 1 行資料的首位址,也就是第 1 行第 0 個元素的位址,因為使用整行資料沒有實際的含義,編譯器遇到這種情況都會轉換為指向該行第 0 個元素的指標;就像一維陣列的名字,在定義時或者和 sizeof、& 一起使用時才表示整個陣列,出現在表示式中就會被轉換為指向陣列第 0 個元素的指標。

*(*(p2+1)+1)表示第 1 行第 1 個元素的值。很明顯,增加乙個 * 表示取位址上的資料。

具有指標型別元素的陣列稱為指標陣列,實質上就是乙個陣列。

型別說明符 *指標變數名[長度];

【注】如:int *p[n]; //int *(p[n])也是乙個指標陣列,這裡小括號可有可無。

優先順序比 * 高,所以先與p結合成為乙個陣列,然後int *說明該陣列中每個元素的資料型別都是「整形指標型別」。

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

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

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

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

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

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