C++的引用(&)與解引用(*)


引用

  從C過來的同學可能會對C++中的“&”表示不解。“&”在C中就是表示取地址符,在C++的實踐中,它也確實有取地址的功能。但是,在C++中,它的功能不止於此,它有了一個更准確的名稱:引用。

  引用是C++的引入的語言特性,它表示某一對象的別名。對象和對象的引用都指向同一地址,對引用的操作實際上就是對原對象的操作。引用的聲明語法為:

  類型標識符 &引用名=目標變量名;

  說明:

  (1)&在此不是求地址運算,而是起標識作用。

  (2)類型標識符是指目標變量的類型。

  (3)聲明引用時,必須同時對其進行初始化。

  (4)引用聲明完畢后,相當於目標變量名有兩個名稱,即該目標原名稱和引用名,且不能再把該引用名作為其他變量名的別名。

  (5)聲明一個引用,不是新定義了一個變量,它只表示該引用名是目標變量名的一個別名,它本身不是一種數據類型,因此引用本身不占存儲單元,系統也不給引用分配存儲單元。故:對引用求地址,就是對目標變量求地址。&ra與&a相等。

  (6)不能建立數組的引用。因為數組是一個由若干個元素所組成的集合,所以無法建立一個數組的別名。

int main( ){
    int a=1;
    int &b=a;
    b=2;
    cout<<a<<endl;
}

//輸出結果為2

引用的應用

  光是給變量取別名似乎並沒有多大的意義,它的常見用法有下面幾種:

1.函數引用傳遞

普通函數的參數傳遞為值傳遞,在調用時,會為形參分配存儲單元,然后將實參的值賦給形參,相當於創建一了份實參的副本供函數使用。值傳遞有兩個特征:

(1)在函數內對形參的操作不會影響實參

(2)當傳入的數據量較大時,會浪費空間。

  為了解決傳遞大塊數據時,值傳遞方式造成的空間浪費,C語言的做法是傳遞指針從而實現直接對原數據的操作。而在C++中,我們可以使用引用傳遞來解決這個問題。只需要將形參定義為引用的形式,例如:

#include <iostream>

using namespace std;

//引用傳遞的方式
void func(int &a){
    a=a+10;
}
//傳統值傳遞的方式
void func1(int a){
    a=a+10;
}
int main( ){
    int a = 5,b=5;
    func(a);
    func1(b);
    cout<<a<<" "<<b<<endl;
}
//輸出結果為15 5

  使用指針與引用的區別在於:使用指針時,雖然傳遞的是指針,但仍然是值傳遞的方式。指針也是變量,系統仍然會為形參分配空間。並且,大量使用指針,會導致程序可讀性變差,且容易出錯。

2.常引用

如果想使用引用,但又想確保引用數據的安全性,此時可以使用const關鍵字來定義常引用。常引用和常量一樣,不允許被修改。

int main( ){
    int a = 1;
    const int &b = a;
    //當嘗試通過引用修改變量時,程序會報錯
    b=2;
}

解引用

  在C語言中"*"用來定義一個指針變量,它不表示實質的運算而僅僅起到標志的作用。但是在C++中“*”是一個一元運算符,叫做“解引用運算符”。它的作用是獲取地址中存儲的值。它的操作數必須是一個合法有效的地址數據。

int main( ){
    int a = 1;
    //創建指針b,存儲a的地址
    int *b = &a;
    //對指針b中存儲的地址進行解引用
    int c = *b;
    //輸出結果為:1 0x61feb4 1
    cout<<a<<" "<<b<<" "<<c;
}

 

參考內容:https://www.cnblogs.com/mlgjb/p/8821340.html


免責聲明!

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



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