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