通过值

时间:2015-09-27 18:36:47

标签: c gcc

我指的是Paul S R Chisholm的书“C Programming Just the FAQs”。根据作者的说法,“因为数组是通过值传递的,所以数组的精确副本被放置在堆栈上。被调用的函数然后接收数组的这个副本并且可以打印它。因为数组传递给了byval_func ()是原始数组的副本,修改byval_func()函数内的数组对原始数组没有影响“

但我想如果我们按照他的例子中给出的那样传递数组,它甚至会在调用部分时改变数组。我甚至尝试过,这符合我的期望。如果我错了,请纠正我。

以下是教科书中给出的示例。

void byval_func(int[]);

void main(void)
{
    int x[10];
    int y;
    /* Set up the integer array. */
    for (y=0; y<10; y++)
    x[y] = y;
    /* Call byval_func(), passing the x array by value. */
    byval_func(x);
}

/* The byval_function receives an integer array by value. */
void byval_func(int i[])
{
    int y;
    /* Print the contents of the integer array. */
    for (y=0; y<10; y++)
    printf(“%d\n”, i[y]);
}

2 个答案:

答案 0 :(得分:3)

听起来那本书的作者不知道C.

  • 数组不是“按值传递”,因为C中没有数组值。数组的值实际上是指向其第一个元素的指针。
  • 这意味着函数可以修改调用者的数组(数组本身永远不会被复制)。
  • void main错了。 main必须返回int

经验法则:如果C书包含void main,则可能不好。

答案 1 :(得分:0)

我觉得作者在那里混淆了。你的代码发生了什么:数组中第一个元素的地址是按值传递的,而不是&#34; 数据结构&#34;数组整体。

通过价值和参考传递是一个很混乱的话题。人们倾向于认为,因为传递给函数的值的修改反映在其范围之外,这意味着参数是通过引用传递的。这是错的。您不能通过C中的引用传递任何内容,只能通过值传递,并且此值可以是引用。

例如,在C ++中,您可以使用&amp; 运算符传递/声明引用。

进一步解释:

在C中,在某些情况下(如M.M所述)*当您只表达数组的名称时,它与表示第一个元素的地址相同:

int x[10]; // you can call func(x) OR func(&x[0]);

正如我所说,你通过传递引用,这个值是第一个元素的地址。

一个有趣的说明:

x[0] is the same as *(x + 0)
x[1] is the same as *(x + 1)

由于[]会导致添加操作,因此您也可以编写

0[x],它会被翻译为*(0 + x),从而产生相同的地址,拨打int a = 9[x]; 100%有效的电话。

* Is an array name a pointer?