2014-03-30 64 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) */