我指的是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]);
}
答案 0 :(得分:3)
听起来那本书的作者不知道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%有效的电话。