簡體   English   中英

為什么我們必須將值而不是地址傳遞給C ++中的“按引用調用”函數?

[英]Why we have to pass the values instead of the address into a “call by reference” function in C++?

我是C ++的新手,現在開始通過引用學習調用。

我在資料中學習了以下代碼塊:

void callByRef(&a, &b);

int main(){
    int k = 12;
    int m = 4;
    callByRef(k, m) //QUESTION HERE
    return 0;
}

void callByRef(&a, &b){
    a += 3;
    b -= 2;
    return;
}

所以我的問題是,在聲明callByRef時,我們使用a和b的地址作為參數,因此當我們在主體中調用callByRef時,為什么需要傳遞(k,m)而不是(&k,&m)?

這是基本的,但是我只是想為將來的學習提供正確的畫面。 多謝你們!

&a的運算符表示變量a的地址, *a的運算符表示變量a尋址的存儲器的內容。 現在,函數定義如下:

void callByRef(int &a, int &b){
    a += 3;
    b -= 2;
    return;
}

其中int &a表示a將是 int類型的某些變量的引用 因此,每當您要調用該函數時,都需要傳遞變量本身而不是其地址,即callByRef(a, b)而不是callByRef(&a, &b)

這樣聲明的原因如下:傳遞給函數的參數,傳遞給值的變量,即按字面意義復制到函數變量中的變量的內容,因此,在函數內部對其進行的任何更改均無效。 例如:

void callByVal(int a, int b){
    a += 3;
    b -= 2;
    return;
}

並且具有:

x = 5;
y = 10;

調用callByVal(x, y)對x和y無效。 為了克服這個問題,您需要通過引用或int &a傳遞參數,或者作為替代方案,您可以傳遞指針並直接更新內存:

void callByPtr(int *a, int *b){
    *a += 3;
    *b -= 2;
    return;
}

現在可以傳遞變量地址了,例如callByPtr(&a, &b)

callByRef()函數將引用作為參數傳遞,因此您無需將顯式引用發送給該函數。 通讀此書可以更好地理解。

講解

您不會傳遞值。 C ++中的引用與指針不完全一樣。 可以將它們視為對象的另一個名稱。

自然,您需要將該名稱綁定到對象,以便引用引用該對象。 例如,當我們寫int &i = k; 我們是說已經命名為k的變量可以稱為i 要綁定引用,我們需要命名另一個對象。 對象的名稱是k ,而不是&k

函數參數和參數也是如此。 函數callByRef被指定為對兩個對象進行操作,它將調用ab 調用該函數時,必須命名它將引用的原始對象。 並且原始對象被命名為km ,而不是&k&m

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM