C++知識點2——指針、引用基礎

引用:

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》

 

歡迎大家評論交流,作者水平有限,如有錯誤,歡迎指出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章