Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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_Parameter Passing_Function Call - Fatal编程技术网

为什么C函数会自动改变数组?

为什么C函数会自动改变数组?,c,arrays,parameter-passing,function-call,C,Arrays,Parameter Passing,Function Call,我正在学习C,我只是好奇为什么C函数,当给定int、char、double等参数时,调用时不改变这些参数的值,但是当它们被传递给数组参数时,它们会改变数组元素 例如: void conversion(int array[]) { array[0] = 0; } void numeric(int m) { m = 0; } 当您声明并初始化int数组[1]={1}和int m=1时,使用这些参数调用函数,数组[0]会更改,但int m不会更改。数组参数被更改,而int参数保持不

我正在学习C,我只是好奇为什么C函数,当给定int、char、double等参数时,调用时不改变这些参数的值,但是当它们被传递给数组参数时,它们会改变数组元素

例如:

void conversion(int array[])
{
    array[0] = 0;
}

void numeric(int m)
{
    m = 0;
}

当您声明并初始化
int数组[1]={1}
int m=1
时,使用这些参数调用函数,
数组[0]
会更改,但
int m
不会更改。数组参数被更改,而int参数保持不变,这有什么原因吗?这与指针有关吗?

C使用传递值传递函数参数,因此对于非数组类型的变量,不能从调用的函数修改值。在被调用函数内部,它接收正在传递的实际参数的副本,因此对被调用函数参数所做的任何更改都不会反映回调用方参数


但是,当将数组传递给函数时,它将衰减为指向数组第一个元素的指针,并且该指针指向的内容可以从调用的函数中修改。这就是为什么在您的例子中,对
array[0]
的更改会反映回调用方,但是对
array
本身的任何尝试更改都不会持久化,因为
array
本身是按值传递的。

数组在传递到函数时会衰减为指针。您不会更改数组,但会更改数组的内容

这两个功能是等效的:

int foo(int arr[]);

int bar(int *arr);
非官方的C-FAQ提供了有关数组和指针如何不同和/或相似的更多信息:


有许多细微的差别。

而不是这个函数

void numeric(int m)
{
    m = 0;
}
void numeric(int *m_ptr)
{
    *m_ptr = 0;
}
考虑下面的代码片段

void numeric(int *m_ptr)
{
    *m_ptr = 0;
}

//...

int m = 1;

numeric( &m );
如您所见,变量
m
将在函数中更改

现在让我们对数组使用相同的函数

int m[1] = 1;

numeric( &m[0] );
在这种情况下,将在函数中更改对象
m[0]

现在这个函数

void numeric(int m)
{
    m = 0;
}
void numeric(int *m_ptr)
{
    *m_ptr = 0;
}
可以像这样重写

void numeric(int m_ptr[])
{
    *m_ptr = 0;
}
因为声明为具有数组类型的参数调整为指针。例如,这些函数声明

void numeric(int m_ptr[1]);
void numeric(int m_ptr[10]);
void numeric(int m_ptr[100]);
void numeric(int m_ptr[]);
相互等价,反过来又等价于函数声明

void numeric(int *m_ptr);
并声明同一个函数。您可以在一个编译单元中包含所有这些声明

另一方面,传递给函数的数组隐式转换为指向其第一个元素的指针。那么上面函数的调用

numeric( &m[0] );
相当于通话

numeric( m );
因此,可以将数组用作参数,并相应地作为参数更改其元素,因为元素通过引用传递给函数。如果您将通过引用传递单个对象,如上面第一个代码段示例中所示,那么它也将被更改


因此,函数是通过引用还是通过值接受参数之间存在差异。如果使用数组,那么它们的元素实际上是通过引用传递给函数的,因此可以在函数中更改。

当您更改数组元素时,您不会更改
数组
变量本身……请缩进您的代码。请共享完整代码以获得必要的帮助:)
数组将衰减为指针。。如果没有适当的背景,这是错误的。示例:
sizeof
运算符。@SouravGhosh正确。数组在传递给函数时会衰减为指针。@Leandros-不仅在传递给函数时,而且通常都是这样。当它不发生时,例外情况很少(其中包括
sizeof
)@StoryTeller是的,有很多细微的差别。对于这个答案,只要知道它们在传递给函数时正在衰减为指针就足够了。即使这样,也有不同的捕获方式。