指針和引用的區別


1、兩者的定義和性質不同

指針是一個變量,存儲的是一個地址,指向內存的一個存儲單元;

引用是原變量的一個別名,跟原來的變量實質上是同一個東西。

int a = 996; int *p = &a; // p是指針, &在此是求地址運算 int &r = a; // r是引用, &在此起標識作用 

上面定義了一個整型變量 a,p 是一個指針變量,p 的值是變量 a 的地址;

而引用 r,是 a 的一個別名,在內存中 r 和 a 占有同一個存儲單元。

2、指針可以有多級,引用只能是一級

int **p; // 合法 int &&a; // 不合法 

3、指針可以在定義的時候不初始化,引用必須在定義的時候初始化

int *p; // 合法 int &r; // 不合法 int a = 996; int &r = a; // 合法 

4、指針可以指向NULL,引用不可以為NULL

int *p = NULL; // 合法 int &r = NULL; // 不合法 

5、指針初始化之后可以再改變,引用不可以

int a = 996; int *p = &a; // 初始化, p 是 a 的地址 int &r = a; // 初始化, r 是 a 的引用  int b = 885; p = &b; // 合法, p 更改為 b 的地址 r = b; // 不合法, r 不可以再變 

6、sizeof 的運算結果不同

int a = 996; int *p = &a; int &r = a; cout << sizeof(p); // 返回 int* 類型的大小 cout << sizeof(r); // 返回 int 類型的大小 

在64位機器上,int* 類型的大小為8個字節,int類型的大小為4個字節。

sizeof 是C/C++ 中的一個操作符(operator),其作用就是返回一個對象或者類型所占的內存字節數。
The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type(including aggregate types). This keyword returns a value of type size_t.

7、自增運算意義不同

如下圖所示,p++之后指向a后面的內存,r++相當於a++。

int a = 996; int *p = &a; int &r = a; p++; r++; 

8、指針和引用作為函數參數時,指針需要檢查是否為空,引用不需要

void fun_p(int *p) { // 需要檢查P是否為空  if (p == NULL) { // do something  } } void fun_r(int &r) { // 不需要檢查r  // do something } 

PS:指針和引用都可以作為函數參數,改變實參的值

 

 

 

 

轉載:

https://zhuanlan.zhihu.com/p/140966943


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM