簡體   English   中英

引用傳遞也可以稱為指針傳遞嗎?

[英]Can Pass by Reference also be called as Pass by Pointer?

我目前正在閱讀將 arguments 傳遞給 C 函數的方法。 在閱讀時我了解到在 C 中有兩種方法可以將 arguments 作為按值傳遞和按引用傳遞。 然后我又讀到我們也可以將指向變量的指針作為參數傳遞。

初學者之書網站上提到這種方法是通過引用傳遞的。

在這個例子中,我們傳遞一個指向 function 的指針。 當我們將指針作為參數而不是變量傳遞時,則傳遞變量的地址而不是值。 因此,function 使用指針所做的任何更改都將永久地在傳遞變量的地址處進行。 這種技術在 C 中稱為引用調用

我知道當我們需要更改或訪問原始變量時,我們可以使用 & 運算符傳遞指針變量或變量的地址。 我想知道這個指針傳遞是否也可以稱為引用傳遞。 指針傳遞也是引用傳遞的方法嗎?

從技術上講,所有arguments 到 C 中的函數都是按值傳遞的。 與 C++ 不同,該語言不支持真正的引用。

通過引用傳遞可以在 C 中模擬,方法是傳遞(按值)要修改的變量的地址,然后取消引用該地址以修改指向的值。 然而,這並不是真正的引用傳遞。

C 中的指針是引用。 C 2018 6.2.5 20 說:

... 指針類型描述了 object,其值提供對所引用類型實體的引用...

當您將指針傳遞給 function 時,您將向 function 傳遞對指針指向的任何 object 的引用。 指針本身是按值傳遞的,但是,因為指針是引用並且您正在傳遞它,所以您通過引用傳遞 object 的描述是准確的。

在開發C++之前,對此沒有任何爭議; 人們說他們通過引用傳遞 object 來描述傳遞指向 object 的指針。 C++ 在其語言中采用“參考”一詞作為新功能的名稱,因此,在 C++ 術語中,“參考”通常指的是該功能,除非另有說明或上下文明確。 但是,在 C 中,我們不受 C++ 術語的約束,通過引用的原始含義保持准確。

通常,所有 arguments 到“c”中的函數都是“按值”傳遞的。 這意味着如果在 function 中修改了參數,則調用者將看不到此修改:

void foo(int val) {
   ...
   val = newval;
   ...
}
void bar() {
   foo(4);
}

上面示例中的值val可以修改並在 'foo' 中使用,但 'bar' 不會看到更新。

為了使更新在調用者中可見,使用了指針。

void foo(int *arg) {
   ...
   *arg = 5;
   ...
}
void bar () {
   int x = 4;
   foo(&x);
   // x will be 5 here
}

在上述情況下,“x”的地址將被傳遞給 function foo,並將在 function *arg中使用它來修改“x”的值。

可以修改 foo 內部指針的值,因為它本身是按值傳遞的

void foo(int *arg) {
   arg = newAddress;
}

但是 function 'bar' 也不會看到這個修改。

因此,“c”中沒有真正的“引用”,但是有些人使用它來引用指針的傳遞。

暫無
暫無

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

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