2014-03-30 65 views
1

我有以下代码:为什么在C中通过引用传递字符数组?

#include <stdio.h> 

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

int main() 
{ 
    char a[]="Hello world"; 
    changeValue(a); 
    printf("%s", a); 
} 

而且我想明白这是怎么工作的。为什么在传递名为'a'的数组时它通过引用传递?那么,我在changeValue里做的改变实际上是从外面看到的吗?不应该将函数参数定义为char * str,以便能够更改它?

+2

它没有通过引用传递;相反,数组衰减成一个指针,而函数实际上接收到一个指向数组第一个元素的指针作为它的参数。 – Jon

+1

[This](http://stackoverflow.com/q/1335786/1410711)!!! – Recker

+0

@Recker:这个问题有很多重复。你不链接到其中的一个。 – tommyo

回答

5

在许多情况下(包括将它们作为函数参数传递)数组被转换为指向其第一个元素的指针。因此,你传递的不是一个数组。事实上,原型中使用的语法只是眼睛糖果

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

上述原型是相同的!

3

C没有“通过参考”的概念。一切都通过价值传递。当你将一个数组传递给一个函数时,它会衰减到一个指向第一个元素的指针。

尽管changeValue的签名看起来以char[]作为参数,但它实际上会收到char*

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