【发布时间】:2019-01-08 19:57:33
【问题描述】:
我在 K&R C 书中读到,当我们将数组传递给函数时,数组的地址(包含数组第一个元素的地址的指针)被传递给函数,因此看起来像引用传递(尽管 C 中没有这种真正的机制)
但是,下面的内容对我来说没有意义 -
void test(char arr[10]) {
arr[2] = 'a';
}
main() {
char arr[5] = "hello";
test(arr);
printf("%s", arr);
return 0;
}
这给了我预期的治疗效果。
但这是否意味着这就是评估的方式?
“char arr[]”参数被分配了指向实际数组的指针?它是如何工作的?
char arr[10] = &arr[0]
对我来说没有意义!
【问题讨论】:
-
我看不出矛盾。 “让它看起来像一个传递引用” - 意味着您可以对其进行修改并让结果在函数外部可见。
-
是的,数组地址的副本作为参数给出。是的,通过这个地址,你确实改变了原来的数组。什么不清楚?
-
数组在可能的情况下会衰减为指针,其中之一是在将其传递给函数时,因此
test(arr);与test(&arr[0]);基本相同。 -
令我困惑的是:我一直是这样想的——当我们将参数传递给函数时,函数定义中的参数和调用函数时的实际参数得到等同于。所以当我们说我们在func定义中有
char arr[]但通过&arr[0]时,我无法理解这两者是如何等同的 -
这是函数的特例。将数组指定为函数参数时,C 语言将参数视为指针类型,而不是数组类型。
标签: c arrays function pass-by-reference