考虑这两个功能:
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)
{
}
where bool
(或enum
)返回函数的成功。而不是检查if ret is null...
(如果你有超过 1 个变量)。
如果你想从你的函数中返回两个值,那么 C 是无能为力的,除非你像你的函数 add2 一样使用指针。
void add2()
{
/* Some Code */
*ptr1=Something;
*ptr2=Something;
}
形式 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);
当你使用像int
. 事实上,在这种情况下,第二个更慢,因为您必须取消引用传递的指针。只有在您的目标是传入一组值时,它才在这种情况下有用)
除非您想向函数传递非常大的数据,否则请始终使用形式 1的函数。在这种情况下,表格 2 会更快。
我们使用第二种形式的原因是因为对于大对象,我们希望避免复制它们。我们可以将它们的内存地址传递给函数,而不是复制它们。这就是指针进来的地方。因此,与其给函数所有数据,不如告诉它这些数据在哪里。(我希望这个比喻足够好)
这在很大程度上取决于偏好和当地惯例。第二种形式可能与一堆其他类似的函数一起使用,其中每个函数中的第三个参数总是作为指向返回值的指针传递。
就个人而言,我几乎所有目的都喜欢第一种形式:它不需要传递指针,并且在处理返回值时允许某种类型的灵活性。
当返回的对象很大时,或者当函数的返回值用于其他目的(例如,发出错误信号)时,通过指针传递的写入内存来返回值是合理的。在您显示的代码中,这两种情况都不是,所以我会选择第一个实现。
从函数返回指针时,必须确保指向的内存在函数调用后有效。这意味着,指针必须指向堆,因此需要在堆上进行分配。这给来电者带来了负担;他必须释放他没有明确分配的内存。