[英]Using pointers to emulate Pass-by-Reference in a Pass-by-Value function (C and C++)
[英]Is Passing a Dynamically Allocated Array to a Function in C an Instance of Pass-by-value or Pass-by-reference?
為了演示,這是一個示例代碼,重新創建將動態分配的數組傳遞給函數的實例。
#include <stdio.h>
#include <stdlib.h>
void fx1(int* arr) {/* code here */ }
int main() {
int *arr = (int *) malloc(sizeof(int) * 10);
fx1(arr);
free(arr);
return 0;
}
在示例中,我首先創建一個動態分配的數組arr 。 然后,將其傳遞給名為fx1的函數。 標題正是我的問題。 將動態分配的數組傳遞給C中的函數是按值傳遞還是按引用傳遞實例? 如果您對此有答案,也希望獲得參考(書籍,文檔等)。
這是“兩者”:
指針按值傳遞,數組“按引用”傳遞。
6.5.2.2函數調用
...
4參數可以是任何對象類型的表達式。 在准備調用函數時,將評估參數,並為每個參數分配相應參數的值 。
...
我在引號中加上了“ both”和“ by reference”,因為在C中沒有引用。指針不是引用,但是當用於“將數組傳遞”給函數時,在某種意義上,它大致可比如果函數修改了數組,則更改對調用者可見。 我認為這有助於了解此處發生的情況。
我們說數組在傳遞給函數時會衰減為指針。 “衰減”是因為指針會丟失一些信息,即數組的長度。 因此,僅從應用程序角度講,這類似於“通過引用”。
在C語言中,一切都是通過值傳遞的。 在您的具體示例中, arr
是。 您沒有像C ++或Java這樣的引用。
讓我們來看一個C ++示例:
void foo(int& i) {
++i;
}
int main() {
int i = 1;
foo();
}
在這里,使用真正的參考。 i
通過引用傳遞,並且foo
通過對i
的引用來修改i
。 沒有發生“按值復制”。
OTOH,在C中,您沒有引用。 你只能寫這樣的東西
void foo(int* i) {
++*i;
}
int main() {
int i = 1;
foo(&i);
}
要在C語言中“通過引用” 1傳遞某些內容,您需要像對其一樣傳遞一個指向它的指針。 指針本身通過值傳遞,但它指向可由函數和分配器修改的存儲區域(在此為i
)。
最后,如果要在C語言中“通過引用”傳遞某些內容,則始終涉及按值復制。 在C ++中不是這樣。
從K&R引用1.8個參數-按值調用:
在C語言中,所有函數參數都按值傳遞。''
1請注意,這在雙引號內。 C沒有“按引用傳遞”。 期。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.