指針與數組

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 *)。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • void* 類型指針:通用變體類型指針;可以不經轉換,賦給其他指針,函數指針除外;malloc返回的就是void*...
    冰吉凌閱讀 3,369評論 0 18
  • 指針是C語言中廣泛使用的一種數據類型。 運用指針編程是C語言最主要的風格之一。利用指針變量可以表示各種數據結構; ...
    朱森閱讀 3,470評論 3 44
  • 二級指針與二維數組 char *string[] ={"abc","abcd","acf"};char str...
    去留無意hmy閱讀 641評論 0 4
  • 指針和數組是 C 語言中比較重要的知識點,尤其是指針和數組結合之后,很多同學就不清楚是怎么一回事了。在這里結合幾個...
    GLGeek閱讀 738評論 0 6
  • 談談李雪 2017-02-17 09:54閱讀:3,975 原文地址:談談李雪 原文作者:武志紅 ?最近的論戰,因...
    風落雨開Q閱讀 7,685評論 0 2