[英]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 ++中使用引用時,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.