考虑两个功能:从函数获取返回值用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