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

为什么C中的字符数组是通过引用传递的?,c,arrays,string,pointers,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); } #包括 无效更改值(字符str[]){ str[2]=“a”; } int main() { 字符a[]=“你好,世界”; 改变价值(a); printf(“%s

我有以下代码:

#include <stdio.h>

void changeValue(char str[]) {
        str[2] = 'a';
}

int main()
{
  char a[]="Hello world";
  changeValue(a);
  printf("%s", a);
}
#包括
无效更改值(字符str[]){
str[2]=“a”;
}
int main()
{
字符a[]=“你好,世界”;
改变价值(a);
printf(“%s”,a);
}
我正试图了解这是如何运作的。为什么在传递名为“a”的数组时,它是通过引用传递的?那么,我在changeValue中所做的更改实际上是从外部看到的?不应该是定义为char*str的函数参数,以便能够更改它?

C没有“按引用传递”的概念。一切都是通过价值传递的。将数组传递给函数时,它将衰减为指向第一个元素的指针

尽管
changeValue
的签名似乎以
char[]
作为其参数,但它实际上接收到一个
char*

C没有“按引用传递”的概念。一切都是通过价值传递的。将数组传递给函数时,它将衰减为指向第一个元素的指针

尽管
changeValue
的签名似乎将
char[]
作为其参数,但在许多情况下(包括将其作为函数参数传递),数组实际上会被转换为指向其第一个元素的指针

因此,您传递的不是数组。事实上,原型中使用的语法非常吸引人

void changeValue(char str[]);
void changeValue(char *str);
以上原型完全相同

在许多情况下(包括将它们作为函数参数传递),数组被转换为指向其第一个元素的指针

因此,您传递的不是数组。事实上,原型中使用的语法非常吸引人

void changeValue(char str[]);
void changeValue(char *str);

以上原型完全相同

在怀疑侵蚀了你对标准的信心之前,你是对的:在C中,只能通过值传递

那么,为什么你似乎认为通过引用传递

简单地说,只有两种情况下数组不会立即衰减为指向其第一个元素的指针:
sizeof
和address(
&

现在,不管您多么频繁地复制这个指针,它仍然会指向同一个内存块。 因此,无论函数何时看起来像是接收数组,它实际上都会接收指针

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

在怀疑侵蚀了您对标准的信心之前,您是对的:在C中,只能通过值传递

那么,为什么你似乎认为通过引用传递

简单地说,只有两种情况下数组不会立即衰减为指向其第一个元素的指针:
sizeof
和address(
&

现在,不管您多么频繁地复制这个指针,它仍然会指向同一个内存块。 因此,无论函数何时看起来像是接收数组,它实际上都会接收指针

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

它不是通过引用传递的;相反,数组衰减为指针,函数实际接收指向数组第一个元素的指针作为其参数@雷克:这个问题有很多重复的地方。您没有链接到其中一个。@tommyo我共享的链接不相关?@Reck:相关,重复,不相关。它不是通过引用传递的;相反,数组衰减为指针,函数实际接收指向数组第一个元素的指针作为其参数@雷克:这个问题有很多重复的地方。您没有链接到其中一个。@tommyo我共享的链接不相关?@Reck:相关,重复,不相关。