細節很重要。尤其是在談論某事如何運作時,尤其是當我們考慮某事為何運作時。目前,據我了解,C中的所有內容都是通過 value 傳遞的。NOTHING是通過參考傳遞的。一些程式員提到 C 中的陣列是通過參考傳遞的。但根據我有限的理解,
即使我們將陣列傳遞給這樣的函式
void traverse(int arr[4]);,它實際上也是作為指標變數的副本被接收,該指標變數存盤了該陣列中第一個元素在記憶體中的位置。然后在函式內部取消參考,但傳遞的初始值實際上是一個區域變數。由于分配給程式堆疊中陣列的記憶體是連續的,因此編譯器能夠使方括號表示法和指標運算一樣作業。
這和通過參考傳遞對我來說不是一回事。我認為這是一個重要的區別。
但另一方面,我們可以說計算中的一切都是按值傳遞的,因為像 Java 這樣的東西會以更微妙的方式做同樣的事情。它實際上只是模擬通過參考傳遞。請指教。
uj5u.com熱心網友回復:
在計算機的位級別,引數只能按值傳遞。表示某個引數的位被寫入指定為傳遞引數的位置的處理器暫存器或記憶體位置。通過參考傳遞是一種基于值傳遞的構造,它使用地址作為傳遞的值。傳遞地址可以自動或手動實作。這兩種方法都是通過參考傳遞的。
當我們通過傳遞某個物體的地址而不是直接傳遞其值來傳遞某個物體時,這稱為按參考傳遞。這個術語早于 C 中“參考”的創建。在匯編語言中,當我們將某事物的地址加載到暫存器中以將其傳遞給函式時,即稱為按參考傳遞。C 標準指定指標提供對物體的參考 (C 2018 6.2.5 20)。因此,當我們有一個指向物件的指標時,我們就有了一個對物件的參考,而當我們將指標傳遞給函式時,我們就是將對該物件的參考傳遞給了函式。
某些語言自動通過參考。FORTRAN 通過參考傳遞所有內容,除了一些用于在 FORTRAN 之外呼叫例程的特殊語法。但是,無論是通過參考傳遞是作為編程語言的自動功能實作的,還是由程式員手動加載匯編語言中的地址,還是由程式員使用諸如 C 之類的語言運算子手動請求地址&,當參考傳遞一個物件,然后通過參考傳遞該物件。
C 創建了一種稱為“參考”的新型別,但這是該詞的新用法。“參考”的 C 含義僅適用于 C 。它不會改變 C 背景關系之外該詞的現有用法。在 C 之外,“參考”有其普通的英文含義,即提供有關另一事物的資訊。
關于在 C 中傳遞陣列的具體問題,在 C 中,陣列引數會自動轉換為其第一個元素的地址,并且該地址通常用于訪問整個陣列。所以陣列實際上是通過參考傳遞的。將此描述為自動轉換為指標只是記錄細節。效果是一樣的:通過提供對呼叫者指定的物件的參考,函式可以訪問該物件。
此外,任何關于“通過參考傳遞”含義的爭議都只是關于術語的爭議,而不是關于計算機中使用的實際機制的爭議。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/430742.html
