指標與陣列的區別

2021-06-22 17:29:07 字數 1300 閱讀 1873

在c/c++中,指標與陣列在很多情況下是可以相互替換的,所以很容易讓人產生一種錯覺,認為二者是等價的,而實際上並非如此。

陣列名對應著(注意不是指向)一塊記憶體,每建立乙個陣列,就需要為其分配相應的記憶體,且其位址與容量在其生命週期內不可變,可以改變的是其內容(「位址不可變,內容可變」這一點跟指標常量很像,但依然不是指標)。

指標指向一塊記憶體,但這塊記憶體並不是因為這個指標分配的,只是這個指標剛好指向它而以,這個指標可以隨時指向別的記憶體。

char a1 = "hello";

char a2 = "hello";

char *p1 = "hello";

char *p2 = "hello";

cout << "a1:" << (void*)a1 << endl; // 0012fd78

cout << "a2:" << (void*)a2 << endl; // 0012fd68

cout << "p1:" << (void*)p1 << endl; // 0044dd74

cout << "p2:" << (void*)p2 << endl; // 0044dd74

a1和a2是兩個陣列,系統為它們分別分配了記憶體(0012fd7、0012fd68),然後用「hello」進行初始化,所以它們分別對應著兩塊不同的記憶體。char a1 = "hello" 實際上等價於如下**:

char a1 = ;
p1和p2是兩個指標,它們都指向同一塊記憶體(0044dd74),這塊記憶體是為常量字串「hello」分配的。

由於p1和p2指向的是常量字串,所以對其內容進行修改是非法的,但可以使其指向別的記憶體:

p1[0] = 'h';     // compiler不能發現該錯誤,但執行時會發生runtime error

p1 = "hello"; // ok,p1指向常量字串「hello」所對應的記憶體

a1[0] = 'h';     // ok

a1 = a2; // error, a1不能作為左值

指標和陣列的別乙個區別是sizeof運算子,sizeof作用於陣列,結果是該陣列所對應的記憶體的大小,sizeof作用於指標,結果是指標變數所佔記憶體的大小:

cout << sizeof(a1) ;     // 6

cout << sizeof(p1); // 4

需要特別注意的是,當陣列作為函式引數時,會自動退化為同型別的指標。

陣列指標與指標陣列的區別

一 陣列指標 也稱行指標 定義 int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。如要將二維陣列賦給一指標,應這樣賦值 int a 3 4 int p 4 該語句是定義乙個陣列指標,...

陣列指標與指標陣列的區別

一 陣列指標 也稱行指標 定義int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。如要將二維陣列賦給一指標,應這樣賦值 int a 3 4 int p 4 該語句是定義乙個陣列指標,指...

陣列指標與指標陣列的區別

陣列指標 也稱行指標 定義 int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。如要將二維陣列賦給一指標,應這樣賦值 int a 3 4 int p 4 該語句是定義乙個陣列指標,指向...