可以在C中传递值吗?

时间:2011-08-25 17:46:56

标签: c

您好我正在阅读this问题,我对如何按值传递数组感到困惑。这是一段代码,我认为应该按值传递数组。

#include <cstdio>
void foo (int arr[]);
int main()
{
    int arr[10];
    foo(arr[10]);
    return 0;
}
void foo (int arr[])
{
.......
}

请告诉我为什么不通过价值?

由于

3 个答案:

答案 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) { ... }

随着黑客攻击,这对你来说并没有太大的帮助。