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...