關於符號&用於引用與取地址的區別


符號&有多種用法,這篇文章討論其作為引用與取地址的區別。

1.&作為引用:可理解為給變量取別名

	int a=6;
	int &b=a; 	

聲明了b是a的一個引用,是a的一個專屬別名,故b不能再作為別的變量的引用,即不能繼續有&b=c。

	int &c=a;  // a可以被多次引用,即被多次起別名
	int &d=b;  // b也可以被引用

對引用b進行賦值、運算等操作,即是對被引用的對象a進行賦值、運算操作,a對應的地址中的數值改變,但a還是a,表示的地址不變

	b--;printf("%d\n",a); //此時a=5.對引用b的操作即是對a本身的操作
	b=4;printf("%d\n",a); //此時a=4,但b還是a的別名 

引用時需要初始化,即引用不能為空,故有int b;,但不能有 int &b;

以swap函數實現為例闡述引用的作用。

inline void swap(int x,int y){
	int t=x;
	x=y;
	y=t;
} 
inline void swap1(int &x,int &y){
	int t=x;
	x=y;
	y=t;
} 
int main(){
	swap(a,b);//未成功交換 
	swap1(a,b);//成功交換 
}

此處等價於&x=a,&y=b。然后x與y對應的數交換,即a與b交換。
故此處的&為引用。

判斷引用的方式
1.定義的時候必須初始化,即&前面有類名或類型名,&后面一定帶 “=”。
2.&后面的名字是新的名字,之前不存在。故此處的函數形參也為引用。

2.&作為取地址,需與指針配合使用。

把內存中某一個地址命名為a,並放入某一數值,&a即代表該數值所在的地址

指針及其應用。

int *x;x=&a;

上式定義了一個指針x,則x的值就代表指向的地址,x代表取出指向地址中的數值。初始指針未定義指向時,默認指向NULL,故指針可以指向空
指針指向的是地址,而不是變量名。不能寫
x=&a。

int *x=&a;

可以把int *看成一個類型名,代表指針,故應為x等於某個地址,即&a。

x=&b;

指針可以多次定義所指向的地址,而引用對應的地址唯一。

x++;

此時是對指針直接進行修改,改變了指針指向的地址,故*x不再指向b所在的地址中的數值。

(*x)++; 

可以直接對指針指向的內容進行修改,代表指針指向的地址中的數值加1。
注意:必須要加括號,否則加一的優先級更高,會導致x指向的地址改變。

特別注意:對指針進行取值操作之前一定要判斷指針是否指向NULL,而對引用操作則無需判斷是否為空。

inline void swap(int *x,int *y){
	int t=*x;  //t是數值,不能為t=x; 
	*x=*y;
	*y=t;
} 
int main(){
	swap(&a,&b);
} 
//此處直接進行等於操作的話,相當於int *x=&a   
inline void swap1(int *x,int *y){
	int *t=x;  //t是指針,不能為t=*x; 
	*x=*y;
	*y=*t;
} //錯誤原因,*t與*x指向同一地址,當*x=*y后,*t也變成了*y 
inline void swap2(int *x,int *y){
	int *t=x;
	x=y;
	y=t;
} // 錯誤原因:只改變了兩個指針的指向,並不影響地址中的數值 

判斷&為取地址的方式:
如果&是取址運算符,也就意味着取一個變量的地址並付給指針變量。&后面緊跟的是變量(已存在);

兩種正確的swap函數的寫法:

inline void swap(int &x,int &y){
	int t=x;
	x=y;
	y=t;
} 
inline void swap(int *x,int *y){
	int t=*x;  //t是數值,不能為t=x; 
	*x=*y;
	*y=t;
} 


免責聲明!

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



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