天天看點

C++中指針和引用、數組之間的差別

指針指向一塊記憶體,它的内容是所指記憶體的位址;而引用則是某塊記憶體的别名,引用初始化後不能改變指向。使用時,引用更加安全,指針更加靈活。

  1. 初始化。引用必須初始化,且初始化之後不能呢改變;指針可以不必初始化,且指針可以改變所指的對象
  2. 空值。指針可以指向空值,不存在指向空值的引用。當引用或者指針作為參數傳遞的時候,拿到一個引用的時候,是不需要判斷引用是否為空的,而拿到一個指針的時候,我們則需要判斷它是否為空。這點經常在判斷函數參數是否有效的時候使用。
  3. 引用和指針指向一個對象時,引用的建立和銷毀不會調用類的拷貝構造函數和析構函數。delete一個指針會調用該對象的析構函數,注意防止二次析構。
  4. 引用和指針與const。存在常量指針和常量引用指針,表示指向的對象是常量,不能通過指針或者常量修改常量;存在指針常量,不存在引用常量,因為引用本身不能修改指向的特性和與指針常量的特性相同,不需要引用常量。
  5. 函數參數傳遞時使用指針或者引用的效果是相同的,都是簡潔操作主調函數中的相關變量,當時引用會更加的安全,因為指針一些修改指向,将不能影響主調函數中的相關變量。是以參數傳遞時盡可能使用引用。
  6. sizeof引用的時候是對象的大小,sizeof指針是指針本身的大小
  7. 引用和指針的實作是相同的,“引用隻是一個别名,不會占記憶體空間”的說法是錯誤的,實際上引用也會再用記憶體空間。

指針和數組之間的差別

  1. 數組要麼在靜态存儲區被建立(全局數組),要麼在棧上被建立。指針可以指向任意類型的記憶體塊。
  2. sizeof可以計算數組的容量,sizeof(p)得到的是一個指針變量的位元組數,而不是p所指向的記憶體容量。C++/C語言沒有辦法知道指針所指的記憶體容量,除非在申請記憶體時記住它。
  3. 注意當數組作為函數的參數進行傳遞時,該數組自動退化為同類型的指針。
  4. 注意下面的錯誤
char a[] = “hello”;
a[0] = ‘X’;
cout << a << endl;
char *p = “world”; // 注意p指向常量字元串
p[0] = ‘X’; // 編譯器不能發現該錯誤
cout << p << endl;      

轉載于:https://www.cnblogs.com/wxquare/p/4826371.html