【引用】
就是一個變量的別名(連內存都不分配)。引用是C++裏定義的(C沒有,&只是取地址操作)。
可以看成是一個const指針(指針地址不可變,指向的內容可變)。
就是一個變量,是一個佔用四字節的變量(32位機上),與其他變量的不同之處就在於它的變量值是一個內存地址,指向內存的另外一個地方。
【引用與指針的區別】
引用 | 指針 |
引用必須在聲明的同時初始化(且非NULL) | 而指針不必 |
引用不可改變(是誰的別名就是誰),引用所指對象的值可以改變 | 指針隨便改(指針的值,指針所指對象的值) |
引用不分配內存 | 指針在聲明時就要分配 |
結論:對於int &a,引用實際是一種隱式指針,是方便編程而引入的,識別由編譯器支持。其實引用&是一個能自動被編譯器逆向引用的常量型指針。
【引用與取地址】
只有在“變量聲明/定義”或“函數聲明/定義”中,&var代表引用;在表達式中,&var代表取地址。
對象存在時,&就是取地址;不存在時,&就是在定義引用。
void func(int& var) //傳引用
{var=5;}
void func2(int* var) //傳指針
{*var=1;}
main()
{
int a=1000;
int& ref = a; // 在聲明中,&是引用
int* const ptr = &a; // 在表達式中,就是個取地址操作
func(a); // a傳引用,得a=5
func(ref); // 效果同上,ref就是a的別名
func(*ptr); // 效果同上,ptr指向a,*ptr等同於a的引用(這裏是const指針)
func(&a); // Error , 不是聲明/定義中,&a代表地址,現在func()要一個引用(即一個變量),而不是地址
func2(&a); // OK. a=1; func2 要一個指針,就是要一個地址。
func2(ptr); // OK.同上
}
聲明/定義的時候,int &var就是通知編譯器,這個參數是“傳引用方式”傳遞。用的時候func(a)就是在傳引用調用了!不是說func(&a)叫傳引用!!!
【*和&相互對偶】
*兩個作用:①聲明指針;②解引用
&兩個作用:①聲明引用;②取地址