2011-02-23 19 views
1

假設你有一個函數:你更喜歡發送參數的方式?

void fun(int *a, int *b); 

哪種方式,你更願意發送的參數?

(1)

int x, y; 
fun(&x, &y); 

(2)

int *x, *y; 
fun(x, y); 

什麼是與其他的方式或兩者是相同的,他們的行爲也將是同樣的問題?

+4

這兩者不具有遠程相同的語義 - 您在第二個中傳遞未初始化的指針,而是在第一個中傳遞一個有效int的指針。你是用C++還是C,因爲答案會有很大的不同。 – Puppy 2011-02-23 12:40:26

+0

@DeadMG這會是怎樣「非常」不同?如在運算符重載? (這裏的例子是'int')或者其他的東西? – kizzx2 2011-02-23 12:46:04

+1

@ kizzx2:因爲在C++中,您可以使用某些情況的引用和其他引用。 – Puppy 2011-02-23 13:12:34

回答

2

通常,如果你想在堆棧上使用前者,而後者如果你在堆上爲它們分配內存,則使用前者。堆棧通常更快,而堆棧通常更大。所以一般情況下,你經常使用第一種模式,並且在處理巨型數組或超大對象時僅使用後者。

0

我通常更喜歡參考輸出參數。你的第二個選項有可能傳遞一個空指針,這個函數可能需要以特殊的方式處理。另外第二個是危險的,因爲你傳遞了懸掛指針

+0

不只是空,但其他invalid.pointers也 – Flexo 2011-02-23 12:40:11

+0

@awoodland:是的,這就是我的意思是「晃來晃去」:) – 2011-02-23 12:41:11

+0

但它有缺點,你不能看到他們是輸出參數,而「&」清楚給出了一些提示。這就是爲什麼人們更喜歡指針。我認爲,Google C++指南的作者也考慮到了這一點。 – nob 2011-02-23 12:45:05

-2

無論哪種方式功能是相同的。行爲沒有變化。

第二個選項,如果x和y未正確初始化,則存在分段錯誤的範圍。

1

我認爲這是完全不相干。行爲是相同的。只需使用便利和常識。如果一些指針已經存在,請使用它們。如果它很短並且沒有變量存儲地址,則只需加上前綴&等。這不是什麼大不了的事情。

+0

我低估了,因爲如果你閱讀OP,他顯然不會在每種方式中表現出相同的行爲 - 也就是說,第一個樂趣是傳遞一個指向兩個現有整數的指針,而第二個樂趣是通過一對未初始化的指針。 – Puppy 2011-02-23 13:13:40

+0

@DeadMG也許吧。我以爲他只是不重複,但誰知道。 – kizzx2 2011-02-23 13:33:33

0

我傾向於同意Google的C++風格指南,他們要求輸入參數是常量引用(const &),輸出參數是指針。

void Foo(const string &in, string *out) 

這給用戶立即模式的隊列,該參數在(上文)是一個輸入參數,和是一個輸出參數。

+0

OP的問題是詢問如何創建調用函數所需的參數,而不是如何編寫函數本身。 – 2011-02-23 15:37:17

2

在C++中,我們通常將對象作爲參考傳遞。這是一個好處,因爲不用擔心NULL指針。

在您的第二個示例代碼中,您傳遞了兩個未初始化的int *,這會導致未定義的行爲。你永遠無法分配到*x*y(技術上你可以,但它是UB,你的程序可能會崩潰)。因爲您指向實際對象,所以首選示例代碼。

相關問題