符號&有多種用法,這篇文章討論其作為引用與取地址的區別。
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;
}