對於c語言中的指標陣列與陣列指標,初次接觸總會讓人有些撓頭,但用得多了就會覺得其實也就那麼回事,所謂指標陣列,就是陣列,只不過它是元素為指標的陣列,而所謂陣列指標,就是指標,只不過它是指向陣列的指標。
(1)
int a[3][4];//二維陣列,儲存int型的數值,編譯器為這個二維陣列分配了3*4個sizeof(int)的連續空間
(2)
int* b[4];//一維陣列,儲存int*型的數值,也就是人們常說的指標陣列,該陣列用來儲存int型資料的位址,編譯器為該一維陣列分配了4個sizeof(int *)的空間
例如:
int a,b,c,d;
b[0] = &a;
b[1] = &b;
b[2] = &c;
b[3] = &d;
(3)
int (*p)[4];//這個稍微複雜一些。本語句表示的含義就是說:p是乙個指向二維陣列的首指標,並且這個二維陣列低維的維數為4。因此,編譯器只是為p分配了乙個指標的空間,在32位系統中,一般是4個位元組。由於它不是乙個陣列,因此,編譯器也不會為之分配陣列空間。
因此,如下賦值是不對的。
int a[3][5];
int (*p)[4] = a;//維數不匹配
但是你可以這樣寫:
int a[3][4];
int (*p)[4] = a;//你可以用p[1][2]等來呼叫a中的元素,就像用a[1][2]一樣
另外還有一點,int (*p)[4] 不僅可以向上面所述的,給其賦予乙個低維相同的二維陣列的起始位址,它也可以用於函式引數的傳遞之中。可以參見最後**中的showvalue1。
(4)
另外二維陣列在函式中的引數傳遞也經常採用
int p[4]的形式。可以參考**中的showvalue2。
int (*p)[4]和int p[4],都是用來指向乙個低維空間為4 的二維陣列的首位址。在函式的引數傳遞中,可見它們的效果是一樣的。它們都只有乙個指標的空間,因為他們只是用來記錄乙個陣列的起始位址。
但是,int p[4]還有不同之處。就是你不能在程式中使用
int p[4];
或者 int a[3][4];
int p[4]=a;
這種方式來為其賦值。它只能用於函式引數的傳遞。這是因為編譯器在遇到 int p[4]; 時,會將其視為普通的二維陣列來處理,因此不能確定其大小,會編譯出錯。
但是你可以用
int n[4] =;
來初始化乙個常規的二維陣列。
注意!!!
void showvalue1(int (*p)[4])
} void showvalue2(int p[4])
} int main(int argc, char* argv)
int (*c)[4] = a; //在定義時即進行初始化
for(i = 0; i< 3; i++)
//int l[4];//error
//int m[4] = a; //error
showvalue1(a);
showvalue2(a);
return 0; }
指標與陣列,指標陣列 陣列指標
int a 10 print n a p,a p a,a print n a 1 p,a 1 p a 1,a 1 a做乙個指標,步長為4,指向乙個元素,a做乙個指標,步長為40,指向乙個維陣列 int b 3 4 print n b p,b p,b p b,b,b print n b 1 p,b 1...
陣列 指標陣列與陣列指標
一 陣列型別 int a 10 printf a d,a 1 d n a,a 1 printf a d,a 1 d n a,a 1 輸出結果 2 陣列元素的首位址是常量,不能修改,這是為了釋放記憶體空間所必需的,否則找不到釋放記憶體空間的首位址了 3 定義乙個陣列型別 定義陣列型別的格式如下 typ...
指標陣列與陣列指標
1.指標陣列 指標陣列中每乙個元素都是乙個指標,也既是存放字串的首位址。所以指標陣列適合處理若干個長度不等的字串。定義的一般形式為 型別說明符 指標陣列名 陣列長度 例如 int p 3 宣告乙個陣列,指標陣列p,由3個int型別指標變數元素組成 從運算子的優先順序分析,由於 的優先順序大於 所以p...