2009-04-08 72 views
7

我有一些代碼,我用下面的變量聲明mantaining:傳遞C數組爲char *函數參數

char tmpry[40]; 

它正在使用此功能使用:

char *SomeFunction(char *tmpryP) { 
    // Do stuff. 
} 

功能電話是:

SomeFunction(&tmpry[0]); 

我很該死的肯定,這只是一樣:

SomeFunction(tmpry); 

我甚至檢查過,SomeFunction中的char *指針最終指向與數組相同的內存位置。

我的問題是關於這兩個函數調用是否相同(因此原始程序員只是討厭)的健全性檢查?

+0

我認爲這將是很好的傳遞也長到SomeFunction的C Programming FAQ部分,以防萬一...... :) – 2009-04-08 06:25:03

+1

字符數組的名稱是數組第一個元素地址的別名。 – David 2009-07-15 16:07:15

+0

你好,我是那些寫這樣的「討厭」的程序員之一。一般來說,我在C++代碼中這樣做,因爲與當前使用的數組抽象關係的耦合較少。即對於一個* abstract *類似的數組結構(像`std :: vector `),重載`operator []`表達式`x`和`&x [0]`將意味着完全不同的東西,* second *其中一個更適合我的意圖。當然,對於純C來說,所有這些都不重要,因爲無論如何C中幾乎沒有數據抽象;因此應優先考慮具有卓越可讀性的拼寫。 – ulidtko 2013-08-20 11:08:17

回答

12

它們是完全一樣的。

someArray[i] 

表示正好

*(someArray + i) 

其中的someArray在第二種情況下是一個指向所述存儲器位置。類似地,

&someArray[i] 

表示正好

(someArray + i) 

在這兩種情況的術語指針存儲器位置。

12

這兩者是等價的,我認爲SomeFunction(tmpry);更具可讀性。

1

雖然第二個看起來不錯,並且澄清了將數組傳遞給函數的意圖,但兩者都是一樣的。但是SomeFunction如何知道被傳遞的數組的大小,它總是假定爲40?我覺得最好將大小作爲參數傳遞給SomeFunction。

+0

我同意,你應該通過大小以及數組。 – 2009-04-08 04:42:50

+0

更好的是使用std :: string或boost/tr1 :: array。 – GManNickG 2009-04-08 04:46:01

1

這兩種變體是等同的,通過這樣的

SomeFunction(tmpry); 

看起來比較清爽。

7

可能是顯著,如果SomeFunction是一個宏,需要它的一個參數的"sizeof",因爲sizeof(tmpry)未必等於sizeof(&tmpry[0])

否則,正如其他人指出的那樣,它們完全一樣。

3

正如其他人所說,這兩個符號是等價的。

我通常會使用簡單的一個,除非有多個呼叫這樣的:

SomeFunction(&tmparry[0]); 
SomeFunction(&tmparry[10]); 
SomeFunction(&tmparry[NNN]); 

哪裏最好所有的常數(神奇數字)會枚舉(或#define)常數。

1

該聲明

int a [10]; int * pa;

數組和指針之間必須牢記一個區別。 指針是一個變量,所以pa = a和pa ++是合法的。 但是數組名不是一個變量;施工像= PA和++是非法

如在函數定義格式參數, 個char [] 和 炭* S 是等價;

來自:The C Programming Language 2th,頁99-100