C++/C程序中,指針和數組在不少地方都是可以相互替換使用的,這就讓人產生一種錯覺,以為兩者是等價的。
數組或是在靜態存儲區被創建(全局數組),或是在棧上被創建。數組名對應著,注意不是指向,一塊內存,其地址與容量在生命期內保持不變(當然,使用了realloc()的不算),只有數組的內容可以改變。
指針可以隨時指向任意類型的內存塊,它的特征是“可變”,所以我們常用指針來操作動態內存。指針遠比數組靈活,當然也就更危險。
區別之一:
char a[] = "hello";
a[0] = 'X';
cout << a << endl;//輸出“Xello”
char *p = "world"; // 注意p指向常量字符串
p[0] = 'X'; // compiler不能發現該錯誤,不過在運行的時候會發生runtime error
cout << p << endl;
區別之二:
用運算符sizeof可以計算出數組的容量(字節數)。比如對應上面的代碼,sizeof(a)的值是6(包括最后面的'\0')。指針p指向a,但是sizeof(p)的值卻是4。這是因為sizeof(p)得到的是一個指針變量的字節數,相當于sizeof(char*),而不是p所指的內存容量siziof(char[6])。C++/C不能知道指針所指的內存容量。
值得注意的是,當數組作為函數的參數進行傳遞時,數組就自動退化為同類型的指針。那么不論數組a的容量是多少,sizeof(a)始終等于sizeof(char *)。