为什么字符数组在C中通过引用传递?

时间:2014-03-30 00:00:58

标签: c arrays string pointers

我有以下代码:

#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的函数参数,以便能够更改吗?

3 个答案:

答案 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) */