0

考虑这两个功能:

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


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

我通常使用 add1 形式的函数,但我发现一些代码使用 add2 形式的函数。
即使大小返回值很大(如数组或结构),我们也可以返回它的指针
我想知道是否有任何理由使用第二种形式?

4

6 回答 6

2

还有返回成功状态的原因。

有很多功能,例如:

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

where bool(或enum)返回函数的成功。而不是检查if ret is null...(如果你有超过 1 个变量)。

于 2013-03-23T17:11:44.953 回答
1

如果你想从你的函数中返回两个值,那么 C 是无能为力的,除非你像你的函数 add2 一样使用指针。

void add2()
{

 /* Some Code */

 *ptr1=Something;
 *ptr2=Something;
}
于 2013-03-23T17:07:24.437 回答
1

形式 2 对于 C 中的“多次返回”非常常见。一个典型的例子是将地址返回到缓冲区和缓冲区的长度:

/* 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);
于 2013-03-23T17:10:26.490 回答
0

当你使用像int. 事实上,在这种情况下,第二个更慢,因为您必须取消引用传递的指针。只有在您的目标是传入一组值时,它才在这种情况下有用)

除非您想向函数传递非常大的数据,否则请始终使用形式 1的函数。在这种情况下,表格 2 会更快。

我们使用第二种形式的原因是因为对于大对象,我们希望避免复制它们。我们可以将它们的内存地址传递给函数,而不是复制它们。这就是指针进来的地方。因此,与其给函数所有数据,不如告诉它这些数据在哪里。(我希望这个比喻足够好)

于 2013-03-23T17:08:14.660 回答
0

这在很大程度上取决于偏好和当地惯例。第二种形式可能与一堆其他类似的函数一起使用,其中每个函数中的第三个参数总是作为指向返回值的指针传递。

就个人而言,我几乎所有目的都喜欢第一种形式:它不需要传递指针,并且在处理返回值时允许某种类型的灵活性。

于 2013-03-23T17:09:13.777 回答
0

当返回的对象很大时,或者当函数的返回值用于其他目的(例如,发出错误信号)时,通过指针传递的写入内存来返回值是合理的。在您显示的代码中,这两种情况都不是,所以我会选择第一个实现。

从函数返回指针时,必须确保指向的内存在函数调用后有效。这意味着,指针必须指向堆,因此需要在堆上进行分配。这给来电者带来了负担;他必须释放他没有明确分配的内存。

于 2013-03-23T17:17:10.687 回答