您好我正在阅读this问题,我对如何按值传递数组感到困惑。这是一段代码,我认为应该按值传递数组。
#include <cstdio>
void foo (int arr[]);
int main()
{
int arr[10];
foo(arr[10]);
return 0;
}
void foo (int arr[])
{
.......
}
请告诉我为什么不通过价值?
由于
答案 0 :(得分:7)
数组在C中的某些上下文中自动衰减为指针。函数调用是其中一个地方。也就是说,您按值传递指针 - C没有其他方式传递参数而不是“按值”。
答案 1 :(得分:4)
因为:
void foo(int arr[])
实际上只是语法糖:
void foo(int *arr)
因此,当您调用该函数时,您的数组会衰减为指向第一个元素的指针。
答案 2 :(得分:1)
简而言之:您不能将数组作为函数参数传递,并将其作为数组类型通过被调用函数接收。该上下文中的数组表达式将在传递给函数之前转换为指针类型。
来自C语言standard:
6.3.2.1左值,数组和函数指示符
...
3除非它是sizeof
运算符或一元&
运算符的操作数,或者是 用于初始化数组的字符串文字,类型为''数组 type ''的表达式是 转换为类型为''指向 type '的指针的表达式,指向的初始元素 数组对象并不是左值。如果数组对象有寄存器存储类,则 行为未定义。
这意味着当你写一些像
这样的东西时int arr[10];
foo(arr);
arr
调用中的表达式foo
会立即转换为指针类型;它被称为“衰变”到int *
类型。因此,所有foo
将获得的是指针值。
更多标准语言:
6.7.5.3函数声明符(包括原型)
...
7参数声明为“ type ”的数组应调整为''限定指针 输入'',其中类型限定符(如果有)是在[
和]
内指定的类型限定符。 数组类型推导。如果关键字static
也出现在[
和]
内 数组类型派生,然后对每个函数调用,对应的值 实际参数应提供对至少具有至少数量的数组的第一个元素的访问 size表达式指定的元素。
这意味着如果函数foo
的原型是
void foo(int arr[])
或
void foo(int arr[10])
将解释为为
void foo(int *arr)
同样,语言的定义是这样的,你不能将数组表达式作为函数参数传递,并让被调用函数作为数组类型接收。
有办法解决这个问题;你可以将数组包装在struct
中并按值传递struct
,如下所示:
struct T { int arr[10]; } var;
foo(var);
...
void foo (struct T arg) { ... }
随着黑客攻击,这对你来说并没有太大的帮助。