我有以下代码:
#include <stdio.h>
void changeValue(char str[]) {
str[2] = 'a';
}
int main()
{
char a[]="Hello world";
changeValue(a);
printf("%s", a);
}
我正在努力了解这是如何运作的。为什么在传递名为&#39; a&#39;的数组时它是通过引用传递的?那么,我在changeValue中所做的更改实际上是从外部看到的?不应该是定义为char * str的函数参数,以便能够更改吗?
答案 0 :(得分:5)
在许多情况下(包括将它们作为函数参数传递),数组将转换为指向其第一个元素的指针。
所以,你传递的不是一个数组。事实上,原型中使用的语法只是眼睛糖果
void changeValue(char str[]);
void changeValue(char *str);
以上原型是完全相同的!
答案 1 :(得分:3)
C没有&#34;通过引用传递&#34;的概念。一切都是通过价值传递的。将数组传递给函数时,它会衰减到指向第一个元素的指针。
即使changeValue
的签名似乎以char[]
为参数,它实际上会收到char*
。
答案 2 :(得分:2)
在怀疑腐蚀你对标准的信心之前,你是对的:在C中只有通过价值才有可能。
那么,为什么你似乎看到通过引用传递?
简单地说,只有两个上下文,其中数组不会立即衰减到指向其第一个元素的指针:sizeof
和地址(&
)。
现在,无论你经常复制这个指针,它仍然会指向相同的内存块。 因此,每当看起来函数接收到一个数组时,它实际上会收到一个指针。
void changeValue(char str[]);
void changeValue(char *str);
/* These two above are equivalent. */
void changeValue(char str[static 1]);
/* the one above always points to at least one element (C99) */