考虑两个功能:
int add1(int x,int y)
{
return x+y;
}
void add2(int x,int y,int *sum)
{
*sum=x+y;
}
我通常使用add1形式的函数,但是我发现了一些使用add2形式函数的代码
即使大小返回值很大(如数组或结构),我们也可以返回它的ponter
我想知道是否有任何理由使用第二种形式?
答案 0 :(得分:2)
还有退回成功状态的原因。
有很多功能,如:
bool f(int arg1, int arg2, int *ret)
{
}
bool
(或enum
)返回函数成功的位置。而不是检查if ret is null...
(如果你有超过1个变量)。
答案 1 :(得分:1)
如果你想从函数中返回两个值,那么除非你像函数add2一样使用指针,否则C是无助的。
void add2()
{
/* Some Code */
*ptr1=Something;
*ptr2=Something;
}
答案 2 :(得分: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);
答案 3 :(得分:0)
当你使用像int
这样小的东西时,表格2的功能并不比表格1的功能快。实际上,在这种情况下,第二个较慢,因为你必须取消引用传递的指针。如果您的目标是传递一系列值,那么它仅在这种情况下有用)
除非您想将非常大的数据传递给该函数,否则请始终使用表单1的函数。在这种情况下,表格2会更快。
我们使用第二种形式的原因是因为对于大型对象,我们希望避免复制它们。我们可以将内存地址传递给该函数,而不是复制。这是指针进入的地方。因此,不要给函数所有数据,而是告诉它这个数据。 (我希望这个比喻足够好)
答案 4 :(得分:0)
这在很大程度上取决于偏好和地方惯例。第二种形式可以与一堆其他类似的函数一起使用,其中每个函数中的第三个参数总是作为指向返回值的指针传递。
就个人而言,我喜欢几乎所有目的的第一种形式:它不需要传递指针,并且它允许在处理返回值时具有某种类型的灵活性。
答案 5 :(得分:0)
通过写入通过指针传递的内存来返回值是合理的,当返回的对象很大时,或者当函数的返回值用于其他目的时(例如,信令错误条件)。在您显示的代码中,这两个都不是这种情况,所以我会先进行实现。
从函数返回指针时,必须确保函数调用后指向的内存有效。这意味着,指针必须指向堆,从而在堆上进行必要的分配。这会给打电话者带来负担;他必须释放他没有明确分配的记忆。