2012-04-20 116 views
4

可能重複:
Difference between passing array and array pointer into function in C這兩個聲明有什麼區別嗎?

我一直在想這一段時間,有沒有這兩者之間有什麼區別?

void f1(char *c); 
void f2(char c[]); 

一個常見的例子是這樣的:

int main(int argc, char **argv); 
int main(int argc, char *argv[]); 

是否有任何理由喜歡一個到另一個,除了藝術的?

+1

http://stackoverflow.com/questions/5573310/difference-between-passing-array-and-array-pointer-into-function-in-c – chepner 2012-04-20 14:20:39

回答

6

沒有區別。

從馬口:

(C99,6.7.5.3p7)類型的數組「的參數作爲的聲明‘’應被調整爲‘合格指針輸入’,其中類型限定符(如果有的話)是在數組類型派生的[和]中指定的那些。「

關於偏好一種形式而非另一種形式的原因,這取決於人們。這裏是H &小號說的話(從T arr[]切換到T *array):

(H & S,5.4.3數組界限)「這將更加準確地反映了執行,但是不太清楚地表明意圖」

+0

誰是H&S? Google對這樣一個簡短的查詢並不是很有幫助。 – orlp 2012-04-20 14:24:53

+0

Harbison&Steele http://careferencemanual.com – ouah 2012-04-20 14:25:46

+0

[Harbison&Steele](http://careferencemanual.com/)。 – 2012-04-20 14:26:25

1

第一個表示這是一個指針,第二個表示這是一個數組。雖然沒有有效的區別,但當您閱讀代碼時,通常期望第一種情況下的單個元素在第二種情況下是多於一個元素的序列。有時這可能會有所幫助。

2

不。在函數聲明/定義中,使用數組作爲參數只是語法糖。它仍然作爲指針傳遞,sizeof(theArgument)仍然會給你sizeof(TheType *)而不是sizeof(TheType) * sizeof(numElements)

0

沒有區別。 C和C++中的每個n維數組都可以解釋爲n維數組和指向(n-1)維數組的指針(因爲指針的[]語義與數組的一樣)。