引用:
1.引用就是對象或變量的別名,但引用不是對象或變量
int a=10; int &b=a;
這裏面,b就是變量a的另一個名字,對b操作就是對a操作,對a操作,b也會變化
void testreference()
{
int a=10;
int &b=a;
b=5;
cout<<a<<b<<endl;
a=4;
cout<<a<<b<<endl;
}
2.因爲引用一定是某個變量的別名,引用一定是和變量綁定在一起的,所以引用必須初始化
int a=10;
int &b;
3.因爲引用不是對象,但是引用又要綁定一個對象,所以不能定義引用的引用
int a=10;
int &b=a;
int &(&c)=a;
4.因爲操作引用就是操作變量或者對象本身,所以對於內置類型,變量和其引用之間的類型要適配
int a=10;
float &b=a;
5.因爲引用必須和變量進行綁定,所以非const引用不能綁定字面值
int a=10;
int &b=20;
所以,引用的基本特性就五個:1.不是對象,2.必須初始化,3.不能定義引用的引用,4.類型適配,5.不能綁定字面值
指針
6.指針就是變量的地址,可以通過引用訪問變量,也可以通過指針訪問變量,但是指針是對象,而引用不是,這是二者的根本區別
void testpointer()
{
int a=10;
int *p=&a;
int *q;
cout<<p<<endl<<q<<endl;
}
通過上述代碼,可以知道,指針可以不初始化(只是爲了演示,不要這樣做),但是引用必須初始化
另外,&符號既能表示引用,也是取地址符號,當&出現在=左側時,是引用,在=右邊就是取地址
7.因爲指針是一個對象,所以可以定義指針的指針,但是不能定義引用的引用
void testpointer()
{
int a=10;;
int *p=&a;
int *q;
int **pp = &p;
cout<<p<<endl<<q<<endl;
cout<<pp<<endl;
}
所以,指針的引用的不同點就是:1.引用必須初始化,指針不用,2.可以定義指針的指針,但是不能定義引用的引用,這兩點的原因就是指針是變量,而引用不是(只是個別名)
8.指針所指向的數據的類型要和指針的類型一致
float a=10;
int *p=&a;
9.指針的引用
因爲指針是對象,引用不是,所以可以定義指針的引用,但是不能定義引用的指針
void testpr()
{
int i=0;
int *pi=&i;
int *&pr=pi;
cout<<pr<<endl<<pi<<endl;
*pr=4;
cout<<i<<endl;
}
int *&pr=pi;說明了如何定義一個指針的引用,可以從右向左讀,
先看紅色部分,我們知道有個對象叫pr,接着看到藍色的&,我們知道pr是一個引用,
最後看到int *,就知道這個引用和一個int類型的指針綁定,這是指針就是pi
因爲pr是pi的別名,所以對可以通過pr改變i
10.void 型指針
void型指針可以存放任意類型的指針,但是不能對void型指針解引用,所以void*指針可以保護數據所在的內存不被修改
void testvoidp()
{
double d=1.2;
double *pd=&d;
int i=11;
int *pi=&i;
void *vp=pi;
vp=pd;
cout<<__func__<<endl;
cout<<*vp;
}
參考:
《C++ Primer》
歡迎大家評論交流,作者水平有限,如有錯誤,歡迎指出