簡體   English   中英

我要求澄清C中的“不通過引用”

[英]I ask for clarification about ''not pass by reference'' in C

嘗試編譯void some_function(int * & some_pointer); 並收到編譯器錯誤: expected ';', ',' or ')' before '&' token. 我意識到,只有在刪除函數引用以void some_function(int * some_pointer); ,我才能進行編譯void some_function(int * some_pointer);

經過研究,我找到了解決方案:“一個人不能在C語言中通過引用”。 它不會編譯該功能。

但是,它引起了人們的注意: scanf("%d", &my_var); 我們一直在通過引用……它是如何工作的? 我假設我們不能創建要求引用的函數,因為我們可以將引用用作參數。 程序將按值傳遞它,然后將更改原始變量。 這是正確的嗎?

還是函數要求一個指針,當我們使用&時會創建指向該變量的指針? 我很困擾。

雖然C語言中的函數不像您發現的那樣支持按引用傳遞,但是它們可以通過接受指針值來模擬按引用傳遞,然后在調用函數時,可以將變量的地址傳遞給它。 這樣,調用函數可以取消引用指針,並在調用函數中更改變量。

例如:

void f(int *x)
{
    *x = 4;
}

int main()
{
    int x = 0;
    printf("x=%d\n", x);    // prints 0
    f(&x);
    printf("x=%d\n", x);    // prints 4
}

當我們調用f(&x)類的函數時, &運算符獲取其操作數的地址,並將該地址傳遞給f 不是參考。

還是函數要求一個指針,當我們使用&時會創建指向該變量的指針?

沒錯

在C ++中,符號&具有多種含義:

  • 當在表達式中用作一元運算符時,它的意思是“獲取地址”,並產生一個指針;
  • 當類型為int& (或實際上是int*& )的一部分時,表示“引用”;
  • (並且,當在兩個算術表達式之間用作二進制運算符時,表示“按位 ”。)

我認為,通過選擇對引用類型使用& ,我的想法是節省創建新符號的過程,並嘗試在指針和引用之間創建某種對稱性。 我認為這行不通; 我認為這確實令人困惑。

但是對您來說,在C語言中沒有意義,因為(您已經發現!)C語言沒有引用。 而是可以將您的函數編寫為采用指針到指針( int** )。 具有諷刺意味的是,您可能需要在調用站點上使用&來表示此類函數的參數!

更為復雜的是,您有時會聽到廣義上使用的“通過引用”一詞。 這在C ++領域中令人困惑,因為“引用”在這里具有更具體的含義。 實際上,引用是用C ++語言引入的,專門用於使“引用傳遞”更加優雅和直觀。 但是回到C語言,更籠統地說,這只是一種說法:“我們指的是事物而不是復制它”。 實際上,在C語言中,我們這樣做的方式實際上是傳遞一個指針

嚴格來說,您不能在C中通過引用進行傳遞。相反,就像在scanf()示例中一樣,您可以按值將變量(也稱為指針)的地址傳遞給函數,並且可以假裝已經傳遞了通過引用變量,但是對C代碼的字面意義的解釋將與此不同。

另一方面,您可以使用C ++引用來真正通過引用傳遞變量。 這種機制,不同於前述一個不訴諸物化的存儲位置,也就是在這種情況下,C ++(語言)不知道該變量的地址任何東西(在C ++編譯器,雖然)。

因此,在C中

  • 可以通過引用(“解釋性”意義)傳遞。
  • 您的C代碼本身無法通過引用傳遞任何內容。

另一方面,在C ++中使用引用時,

  • 可以參考引用。
  • 您的C ++代碼也可以通過引用傳遞。

暫無
暫無

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

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