假設你有一個函數:你更喜歡發送參數的方式?
void fun(int *a, int *b);
哪種方式,你更願意發送的參數?
(1)
int x, y;
fun(&x, &y);
(2)
int *x, *y;
fun(x, y);
什麼是與其他的方式或兩者是相同的,他們的行爲也將是同樣的問題?
假設你有一個函數:你更喜歡發送參數的方式?
void fun(int *a, int *b);
哪種方式,你更願意發送的參數?
(1)
int x, y;
fun(&x, &y);
(2)
int *x, *y;
fun(x, y);
什麼是與其他的方式或兩者是相同的,他們的行爲也將是同樣的問題?
通常,如果你想在堆棧上使用前者,而後者如果你在堆上爲它們分配內存,則使用前者。堆棧通常更快,而堆棧通常更大。所以一般情況下,你經常使用第一種模式,並且在處理巨型數組或超大對象時僅使用後者。
無論哪種方式功能是相同的。行爲沒有變化。
第二個選項,如果x和y未正確初始化,則存在分段錯誤的範圍。
我傾向於同意Google的C++風格指南,他們要求輸入參數是常量引用(const &),輸出參數是指針。
void Foo(const string &in, string *out)
這給用戶立即模式的隊列,該參數在(上文)是一個輸入參數,和出是一個輸出參數。
OP的問題是詢問如何創建調用函數所需的參數,而不是如何編寫函數本身。 – 2011-02-23 15:37:17
在C++中,我們通常將對象作爲參考傳遞。這是一個好處,因爲不用擔心NULL指針。
在您的第二個示例代碼中,您傳遞了兩個未初始化的int *
,這會導致未定義的行爲。你永遠無法分配到*x
或*y
(技術上你可以,但它是UB,你的程序可能會崩潰)。因爲您指向實際對象,所以首選示例代碼。
這兩者不具有遠程相同的語義 - 您在第二個中傳遞未初始化的指針,而是在第一個中傳遞一個有效int的指針。你是用C++還是C,因爲答案會有很大的不同。 – Puppy 2011-02-23 12:40:26
@DeadMG這會是怎樣「非常」不同?如在運算符重載? (這裏的例子是'int')或者其他的東西? – kizzx2 2011-02-23 12:46:04
@ kizzx2:因爲在C++中,您可以使用某些情況的引用和其他引用。 – Puppy 2011-02-23 13:12:34