考慮兩個功能:從函數獲取返回值用C
int add1(int x,int y)
{
return x+y;
}
void add2(int x,int y,int *sum)
{
*sum=x+y;
}
我通常使用的形式ADD1的功能,但我發現使用形式ADD2某些功能的代碼。
即使大小返回值很大(如數組或結構體),我們可以返回它的電位器
我不知道是否有任何理由使用第二種形式?
考慮兩個功能:從函數獲取返回值用C
int add1(int x,int y)
{
return x+y;
}
void add2(int x,int y,int *sum)
{
*sum=x+y;
}
我通常使用的形式ADD1的功能,但我發現使用形式ADD2某些功能的代碼。
即使大小返回值很大(如數組或結構體),我們可以返回它的電位器
我不知道是否有任何理由使用第二種形式?
還有返回成功狀態的原因。
有很多的功能,如:
bool f(int arg1, int arg2, int *ret)
{
}
凡bool
(或enum
)返回函數的成功。而不是檢查if ret is null...
(如果你有多個變量)。
如果你想從你的函數返回兩個值,那麼C是無奈的,除非你使用指針就像你的函數add2。表格2
void add2()
{
/* Some Code */
*ptr1=Something;
*ptr2=Something;
}
+1,如果參數同時用於輸入和輸出,也很有用。 – FatalError 2013-03-23 17:08:35
功能並不比形式1的功能,更快,當你使用的東西小int
。實際上,在這種情況下,第二個比較慢,因爲您必須取消引用傳遞的指針。只有當你的目標是傳遞一組值時纔有用)
總是使用表格1的函數,除非你想將非常大的數據段傳遞給函數。在這種情況下,表格2會更快。
我們使用第二種形式的原因是因爲對於大對象,我們希望避免複製它們。而不是拷貝他們,我們可以通過他們的內存地址到函數。這是指針進入的地方。因此,不是給予函數所有的數據,而只是告訴它這個數據在哪裏。 (我希望這個比喻足夠好)
這很大程度上是一個偏好和地方約定的問題。第二種形式可能與其他類似函數一起使用,其中每個函數的第三個參數總是作爲指向返回值的指針傳遞。個人而言,我喜歡幾乎所有用途的第一種形式:它不需要傳遞指針,並且它在處理返回值時允許某種類型的靈活性。
表格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);
當返回的對象較大時,或者函數的返回值用於其他目的(例如,信號傳輸錯誤條件)時,通過寫入通過指針傳遞的內存來返回值是合理的。在你所展示的代碼中,這兩者都不是這種情況,所以我會去第一次實現。
當你從一個函數返回一個指針時,你必須確保指向的內存在函數調用後有效。這意味着,指針必須指向堆,在堆上進行必要的分配。這給呼叫者帶來了一個burdon;他必須釋放他沒有明確分配的內存。
是否有像使用堆棧或任何其他性能問題的情況? – Roronoa 2013-03-23 17:19:27
好吧,你傳遞給函數更多的參數,所以你使用堆棧更多,但它是毫無意義的...尤其是當轉移指針.. – Alon 2013-03-23 17:22:01
這真的很有幫助。謝謝你.. – Roronoa 2013-03-23 17:26:34