簡體   English   中英

將動態分配的數組傳遞給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中的函數是按值傳遞還是按引用傳遞實例? 如果您對此有答案,也希望獲得參考(書籍,文檔等)。

這是“兩者”:

指針按值傳遞,數組“按引用”傳遞。

C標准草案,N1256:

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.

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