2013-03-23 128 views
0

考虑两个功能:从函数获取返回值用C

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


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

我通常使用的形式ADD1的功能,但我发现使用形式ADD2某些功能的代码。
即使大小返回值很大(如数组或结构体),我们可以返回它的电位器
我不知道是否有任何理由使用第二种形式?

回答

2

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

有很多的功能,如:

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

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

+0

是否有像使用堆栈或任何其他性能问题的情况? – Roronoa 2013-03-23 17:19:27

+0

好吧,你传递给函数更多的参数,所以你使用堆栈更多,但它是毫无意义的...尤其是当转移指针.. – Alon 2013-03-23 17:22:01

+0

这真的很有帮助。谢谢你.. – Roronoa 2013-03-23 17:26:34

1

如果你想从你的函数返回两个值,那么C是无奈的,除非你使用指针就像你的函数add2。表格2

void add2() 
{ 

/* Some Code */ 

*ptr1=Something; 
*ptr2=Something; 
} 
+0

+1,如果参数同时用于输入和输出,也很有用。 – FatalError 2013-03-23 17:08:35

0

功能并不比形式1的功能,更快,当你使用的东西小int。实际上,在这种情况下,第二个比较慢,因为您必须取消引用传递的指针。只有当你的目标是传递一组值时才有用)

总是使用表格1的函数,除非你想将非常大的数据段传递给函数。在这种情况下,表格2会更快。

我们使用第二种形式的原因是因为对于大对象,我们希望避免复制它们。而不是拷贝他们,我们可以通过他们的内存地址到函数。这是指针进入的地方。因此,不是给予函数所有的数据,而只是告诉它这个数据在哪里。 (我希望这个比喻足够好)

0

这很大程度上是一个偏好和地方约定的问题。第二种形式可能与其他类似函数一起使用,其中每个函数的第三个参数总是作为指向返回值的指针传递。个人而言,我喜欢几乎所有用途的第一种形式:它不需要传递指针,并且它在处理返回值时允许某种类型的灵活性。

1

表格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); 
0

当返回的对象较大时,或者函数的返回值用于其他目的(例如,信号传输错误条件)时,通过写入通过指针传递的内存来返回值是合理的。在你所展示的代码中,这两者都不是这种情况,所以我会去第一次实现。

当你从一个函数返回一个指针时,你必须确保指向的内存在函数调用后有效。这意味着,指针必须指向堆,在堆上进行必要的分配。这给呼叫者带来了一个burdon;他必须释放他没有明确分配的内存。