引用 與 取地址 以及指針的關係

【引用】

就是一個變量的別名連內存都不分配)。引用是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)叫傳引用!!!


【*和&相互對偶】

*兩個作用:①聲明指針;②解引用

&兩個作用:①聲明引用;②取地址

發佈了12 篇原創文章 · 獲贊 4 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章