Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将动态分配的数组传递给C中的函数是按值传递还是按引用传递?_C_Arrays_Dynamic Allocation - Fatal编程技术网

将动态分配的数组传递给C中的函数是按值传递还是按引用传递?

将动态分配的数组传递给C中的函数是按值传递还是按引用传递?,c,arrays,dynamic-allocation,C,Arrays,Dynamic Allocation,为了演示,下面是一个示例代码,它重新创建了将动态分配的数组传递给函数的实例 #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; } #包括 #包括 void fx

为了演示,下面是一个示例代码,它重新创建了将动态分配的数组传递给函数的实例

#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;
}
#包括
#包括
void fx1(int*arr){/*此处代码*/}
int main(){
int*arr=(int*)malloc(sizeof(int)*10);
fx1(arr);
免费(arr);
返回0;
}
在本例中,我首先创建一个动态分配的数组,arr。然后,我将其传递给一个名为fx1的函数。 标题正是我的问题。将动态分配的数组传递给C中的函数是按值传递还是按引用传递?如果您对此有答案,我还希望获得一份参考资料(书籍、文档等)。

这是“两者皆有”:

指针按值传递,数组“按引用”传递

6.5.2.2函数调用

4参数可以是任何对象类型的表达式。在准备调用函数时,参数 计算,并为每个参数指定 相应的参数。

我将“两者”和“按引用”放在引号中,因为C中没有引用。指针不是引用,但当用于向函数“传递数组”时,它大致相当,因为如果函数修改数组,则调用方可以看到更改。我认为这有助于理解这里发生的事情。

我们说数组在传递给函数时衰减为指针。“衰减”,因为指针丢失了一些信息,即数组的长度。所以说这类似于“通过引用传递”只是从应用程序的角度来看。

在C中,一切都是通过值传递的。在您的具体示例中,
arr
is。你没有像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中,所有函数参数都是通过值传递的。“”



请注意,这是在双引号内。C没有“按引用传递”。句点。

“在C中,所有内容都是按值传递的。”“要在C中“按引用传递”某个内容,需要传递指向它的指针。”这两个似乎相互矛盾。你能从C的角度解释一下吗?@Mercado为了解决矛盾的部分,我在“引用”中加了双引号。从技术上讲,C中没有这样的东西。无论如何,你可以将指向某个内存位置的指针传递给函数,让函数修改它。好的。这些信息的任何依据/来源,特别是对于“在C中,一切都是通过值传递的。”?我不认为我传递了指向“it”的指针。您可以更改数组的内容,但相反,如果您在函数调用中更改“it”(arr)的值,使用malloc为其指定一个新的内存地址,则新的内存地址将不会从调用函数调用的位置出现(这是主函数),因为arr是函数中的一个局部变量。如果我错了,请纠正我,我想理解“通过引用传递”的真正含义,当涉及到数组时,它似乎会让人困惑。我这样认为:引用比C提供的抽象更高。因此,任何“引用”都是应用程序语义的问题,而不是C.解释或源?这就解释了为什么指针是按值传递的,因为函数调用中的指针是另一个与main中的指针不同的局部变量。我说得对吗?是的,没错。函数中的指针是副本,但它指向同一数组。谢谢。数组是通过引用传递的原因是什么?严格地说,在C中,所有内容都是通过值传递的。因此,按值传递指针。但指针有点像引用,所以可以说“通过引用”传递数组。在C语言中,无法按值传递数组,这是不可能的。
arr
是指针。它指向由
malloc
分配的数组的第一个元素。将指针传递给该数组的第一个元素。将这种情况称为“传递数组”是对表示法的滥用。C没有按引用传递。谢谢。我注意到(1)C没有按引用传递,(2)arr是指针,而不是数组。