将动态分配的数组传递给 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".
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." 句点。
为了演示,这里有一个示例代码,它重新创建了将动态分配的数组传递给函数的实例。
#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".
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." 句点。