指針和引用的區別:
這裏對於c++中的指針和引用的區別做一個簡單的總結!
1. 非空區別
在任何情況下都不能使用指向空值的引用,一個引用必須總是指向某些對象。因此如果你使用某一個變量讓它指向對象,但是該變量在有些時候可能不指向任何對象,這個時候你應該把它聲明爲指針,這樣你就可以賦空值給該變量。相反的,如果某個變量指向一個對象且你不允許這個對象爲空值,這個時候你就將它聲明爲引用(也許有點繞…)。不存在指向空值的引用也說明使用引用的代碼效率比指針高。
上代碼–>在 note1 時:
#include<iostream>
int main()
{
int a = 1;
int &ref = a ; //note1
int *p; //指針可以爲空
//int &ref; //note2
std::cout<< ref << std::endl;
}
輸出:
note2時候的輸出:
代碼2:
#include<iostream>
int main()
{
int a = 1;
int b;
int &ref = a ;
int *p = &b;
b = 5;
std::cout<< ref << std::endl;
std::cout<< *p << std::endl;
std::cout<< p << std::endl;
}
輸出:
2. 判斷合法性
在使用引用之前不需要測試它的合法性,相反,指針總是應該被測試,防止其爲空,因爲聲明的指針是可以不指向任何對象的,所以要進行判空操作。
3. 是否可修改
指針可以被重新賦值指向另一個對象,而作爲引用,總是指向初始化時被指定的對象,以後不能改變,但是其指定對象的內容可以改變。
4. 應用區別
總的來說,以下情況應該使用指針:1、考慮到存在不指向任何對象的可能;2、需要在不同的時刻設置不同的對象。如果只是指向一個對象且指向一個對象之後不再改變,那麼推薦使用引用。
Example:
#include<iostream>
int main()
{
int v1;
int v2 = 1024;
int v3 = 999;
int &ref1; //錯誤,沒有對於引用初始化
int &ref2 = v1; //正確,聲明引用同時初始化,ref2是v1的別名
int &ref3 = v1; //正確,同上
int *p;
*p = 5; //錯誤,指針p沒有指向實際的地址,這種情況下賦值賦的值不知道放到那裏去,所以是錯誤的
p = &v3; //正確,p指向v3實際的地址
const double x1; //錯誤,const常量必須初始化
const double x2 = 10.0;
const double x3 = 0.5;
const double *p1 = &x2;
std::cout << p;
return 0;
}
歡迎指正!