2013-03-23 130 views
0

考慮兩個功能:從函數獲取返回值用C

int add1(int x,int y) 
{ 
return x+y; 
} 


void add2(int x,int y,int *sum) 
{ 
*sum=x+y; 
} 

我通常使用的形式ADD1的功能,但我發現使用形式ADD2某些功能的代碼。
即使大小返回值很大(如數組或結構體),我們可以返回它的電位器
我不知道是否有任何理由使用第二種形式?

回答

2

還有返回成功狀態的原因。

有很多的功能,如:

bool f(int arg1, int arg2, int *ret) 
{ 
} 

bool(或enum)返回函數的成功。而不是檢查if ret is null...(如果你有多個變量)。

+0

是否有像使用堆棧或任何其他性能問題的情況? – Roronoa 2013-03-23 17:19:27

+0

好吧,你傳遞給函數更多的參數,所以你使用堆棧更多,但它是毫無意義的...尤其是當轉移指針.. – Alon 2013-03-23 17:22:01

+0

這真的很有幫助。謝謝你.. – Roronoa 2013-03-23 17:26:34

1

如果你想從你的函數返回兩個值,那麼C是無奈的,除非你使用指針就像你的函數add2。表格2

void add2() 
{ 

/* Some Code */ 

*ptr1=Something; 
*ptr2=Something; 
} 
+0

+1,如果參數同時用於輸入和輸出,也很有用。 – FatalError 2013-03-23 17:08:35

0

功能並不比形式1的功能,更快,當你使用的東西小int。實際上,在這種情況下,第二個比較慢,因爲您必須取消引用傳遞的指針。只有當你的目標是傳遞一組值時纔有用)

總是使用表格1的函數,除非你想將非常大的數據段傳遞給函數。在這種情況下,表格2會更快。

我們使用第二種形式的原因是因爲對於大對象,我們希望避免複製它們。而不是拷貝他們,我們可以通過他們的內存地址到函數。這是指針進入的地方。因此,不是給予函數所有的數據,而只是告訴它這個數據在哪裏。 (我希望這個比喻足夠好)

0

這很大程度上是一個偏好和地方約定的問題。第二種形式可能與其他類似函數一起使用,其中每個函數的第三個參數總是作爲指向返回值的指針傳遞。個人而言,我喜歡幾乎所有用途的第一種形式:它不需要傳遞指針,並且它在處理返回值時允許某種類型的靈活性。

1

表格2是用於C.「多重返回」 A典型的例子是返回地址到緩衝器和該緩衝器的長度很常見的:

/* Returns a buffer based on param. Returns -1 on failure, or 0 on success. 
Buffer is returned in buf and buflen. */ 
int get_buffer(void *param, char **buf, int *buflen); 
0

當返回的對象較大時,或者函數的返回值用於其他目的(例如,信號傳輸錯誤條件)時,通過寫入通過指針傳遞的內存來返回值是合理的。在你所展示的代碼中,這兩者都不是這種情況,所以我會去第一次實現。

當你從一個函數返回一個指針時,你必須確保指向的內存在函數調用後有效。這意味着,指針必須指向堆,在堆上進行必要的分配。這給呼叫者帶來了一個burdon;他必須釋放他沒有明確分配的內存。