C++/C程序中竭翠,指針和數(shù)組在不少地方都是可以相互替換使用的,這就讓人產(chǎn)生一種錯覺薇搁,以為兩者是等價的斋扰。
數(shù)組或是在靜態(tài)存儲區(qū)被創(chuàng)建(全局?jǐn)?shù)組),或是在棧上被創(chuàng)建。數(shù)組名對應(yīng)著传货,注意不是指向屎鳍,一塊內(nèi)存,其地址與容量在生命期內(nèi)保持不變(當(dāng)然损离,使用了realloc()的不算)哥艇,只有數(shù)組的內(nèi)容可以改變。
指針可以隨時指向任意類型的內(nèi)存塊僻澎,它的特征是“可變”貌踏,所以我們常用指針來操作動態(tài)內(nèi)存。指針遠比數(shù)組靈活窟勃,當(dāng)然也就更危險祖乳。
區(qū)別之一:
char a[] = "hello";
a[0] = 'X';
cout << a << endl;//輸出“Xello”
char *p = "world"; // 注意p指向常量字符串
p[0] = 'X'; // compiler不能發(fā)現(xiàn)該錯誤,不過在運行的時候會發(fā)生runtime error
cout << p << endl;
區(qū)別之二:
用運算符sizeof可以計算出數(shù)組的容量(字節(jié)數(shù))秉氧。比如對應(yīng)上面的代碼眷昆,sizeof(a)的值是6(包括最后面的'\0')。指針p指向a汁咏,但是sizeof(p)的值卻是4亚斋。這是因為sizeof(p)得到的是一個指針變量的字節(jié)數(shù),相當(dāng)于sizeof(char*)攘滩,而不是p所指的內(nèi)存容量siziof(char[6])帅刊。C++/C不能知道指針?biāo)傅膬?nèi)存容量。
值得注意的是漂问,當(dāng)數(shù)組作為函數(shù)的參數(shù)進行傳遞時赖瞒,數(shù)組就自動退化為同類型的指針。那么不論數(shù)組a的容量是多少蚤假,sizeof(a)始終等于sizeof(char *)栏饮。