你喜欢哪种方式发送参数?

时间:2011-02-23 12:35:01

标签: c++ c programming-languages

假设你有一个功能:

void fun(int *a, int *b);

您希望以哪种方式发送参数?

(1)

int x, y;
fun(&x, &y);

(2)

int *x, *y;
fun(x, y);

其他方式有什么问题或两者相同,他们的行为也会一样?

6 个答案:

答案 0 :(得分:2)

如果你想要堆栈上的变量,通常使用前者,如果你在堆上为它们分配内存,则使用后者。堆栈通常更快,而堆通常更大。所以一般来说,你经常使用第一个模式,而在处理巨型数组或非常大的对象时只使用后者。

答案 1 :(得分:2)

在C ++中,我们通常将对象作为引用传递。这是一个好处,因为对NULL指针的担心较少。

在第二个示例代码中,您传递了两个未初始化的int *,这将导致未定义的行为。您永远无法分配到*x*y(技术上您可以,但它是UB,您的程序可能会崩溃)。首选示例代码,因为您指向实际对象。

答案 2 :(得分:1)

我认为这完全无关。行为是一样的。只需使用方便和常识。如果某些指针已经存在,请使用它们。如果它很短并且没有变量存储地址,只需加上前缀&等等。这不是什么大问题。

答案 3 :(得分:0)

我通常更喜欢输出参数的引用。您的第二个选项有可能传递一个空指针,该指针可能需要以特殊方式处理该函数。另外第二个是危险的,因为你传递了悬空指针

答案 4 :(得分:0)

我倾向于同意Google的c ++样式指南,他们要求输入参数为const引用(const&),输出参数是指针。

void Foo(const string &in, string *out)

这为用户提供了一个直接模式队列, in (上面)中的参数是输入参数, out 是输出参数。

答案 5 :(得分:-2)

无论哪种方式功能相同。行为没有变化。

使用第二个选项,如果x和y未正确初始化,则存在分段错误的范围。