指標陣列與陣列指標

2021-06-09 02:43:26 字數 1680 閱讀 2016

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