将动态分配的数组传递给 C 中的函数是 Pass-by-value 或 Pass-by-reference 的实例吗?

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 中的函数是 pass-by-value 或 pass-by-reference 的实例吗?如果您对此有答案,我还想要 reference/s(书籍、文档等)。

是"both":

指针传值,数组"by reference".

C Standard draft, N1256:

6.5.2.2 Function calls
...
4 An argument may be an expression of any object type. In preparing for the call to a function, the arguments are evaluated, and each parameter is assigned the value of the corresponding argument.
...

我把"both"和"by reference"放在引号里,因为C中没有引用。指针不是引用,但是当用来"pass an array" 对于一个函数,它大致是可比的,在这个意义上,如果函数修改了数组,那么变化对调用者是可见的。我认为这有助于理解这里发生的事情。
当传递给函数时,我们说数组 衰减 为指针。 "Decay" 因为指针丢失了一些信息,即数组的长度。所以说这类似于"pass by reference"只是从应用的角度来看。

在 C 中,一切都是按值传递的。在你的具体例子中 arr 是。您没有像 C++ 或 Java.

中那样的引用

让我们举一个C++的例子:

void foo(int& i) {
    ++i;
}

int main() {
    int i = 1;

    foo();
}

这里使用的是真实引用。 i 通过引用传递,foo 通过对 i 的引用修改 i没有"copying by value"发生。

OTOH,在 C 中,您没有引用。你只能这样写

void foo(int* i) {
    ++*i;
}

int main() {
    int i = 1;

    foo(&i);
}

要在 C 中传递某些东西 "by reference"1,您需要传递指向它的指针,就像您所做的那样。指针本身 由值 传递,但它 引用 到一个内存区域(此处 i)可由函数 [=35] 修改=]和分配器。

最后,如果你想在C中传递一些东西"by reference",总是涉及按值复制。在 C++ 中不是这样。

引用自 K&R,1.8 参数 - 按值调用:

In C, all function arguments are passed by value.''


1 请注意,这是在双引号内。 C 没有 "pass-by-reference." 句点。