在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 該語句是定義乙個陣列指標,指向...