2009-12-04 74 views
3

我有一個功能:傳遞字符串作爲參數用C

int getparam(char *gotstring) 

和我傳遞一個字符串參數給它,如char *sendstring = "benjamin"

代替上述聲明我可以使用的,

int getparam(char gotstring[]) 

問題:哪一個更好?如果我不得不使用int getparam(char gotstring[])我必須對現有函數進行哪些其他更改?

回答

5

int getparam(char gotstring[])int getparam(char* gotstring)是相同的。就個人而言,我會推薦後一種語法,因爲它更好地描述了實際正在發生的事情。 getparam函數只有一個指針給字符串;它沒有關於實際數組大小的知識。不過,這只是我的看法;要麼會工作。

1

在這種情況下,它們意味着同樣的事情,並且不需要更改函數的其餘部分。但請注意,一般來說,數組和指針是不同的東西。

1

兩者都不是更好,真的。這是你更舒服的。在習慣上,使用char * arg代替char arg [](比如strcmp,strcpy等)更爲常見。

+3

就其中一個實際上更好的方面而言,我一直認爲'char mystring []'語法作爲一個函數參數是非常具有誤導性的。歷史上,無經驗的C程序員在錯誤地認爲數組大小信息被保存在函數參數中,並且sizeof(mystring)會相應地返回數組的大小,而不僅僅是指針的大小。我個人認爲這個語法不應該被允許。 – 2009-12-04 11:52:09

1

接受一個字符串參數的最好辦法是

int getparam(const char *gotstring); 

然後,您可以調用這個使用文本字符串:

int main(void) 
{ 
    int x = getparam("is this a parameter string?"); 
    return 0; 
} 

或字符數組:

int main(void) 
{ 
    char arg[] = "this might be a parameter string"; 
    int x = getparam(arg); 
    return 0; 
} 

的在參數指針上使用const指示調用者該參數是隻讀的insi de功能,這是非常好的信息。

1

由於陣列都通過引用在C發送兩個

int getparam(char *gotstring) 

int getparam(char gotstring[]) 

裝置是相同的。 但是第一個使用更多。所以使用它會讓你成爲一個優秀的C公民。

+0

我傾向於不同意(特別是從衆心理上的解釋)。這些結構對於編譯器是相同的,對於人類來說,他們可以(並且我應該說)在語義上有所不同:[]指示傳遞數組,*傳遞指向單個元素的指針。 – MaR 2009-12-04 13:11:57

-1

這稱爲通過引用傳遞和如何名稱指出就意味着傳遞變量的只是一個參考(在這種情況下char*)。

任何一種解決方案都能正常工作,實際情況是,當調用void functionName(char* string)時,內存中第一個char的地址將被保存在堆棧中並作爲參數傳遞給該函數。

因此,對函數中變量的任何編輯都會編輯原始變量。在這種情況下,因爲你需要傳遞一個數組,所以你只需要這個選項。

對於標準類型,如intfloat可以區分它們:

void passByValue(int i); 
void passByReference(int &i); 

不同的是,在前者的情況下的值在調用函數時被複制到棧,而在後者中只是一個參考(指針)傳遞給該值。

+0

請讓我想知道downvoting的原因,只是爲了理解錯誤和無效重複他們。沒有理由的倒退無用,尤其對我來說。謝謝.. – Jack 2009-12-04 15:45:48

+0

我沒有downvote你,所以我不能撤消它,但大概downvoter惱火,你混淆傳遞參考傳遞一個值的指針的想法 – 2009-12-04 16:14:32

相關問題