假设你有一个功能:
void fun(int *a, int *b);
您希望以哪种方式发送参数?
(1)
int x, y;
fun(&x, &y);
(2)
int *x, *y;
fun(x, y);
其他方式有什么问题或两者相同,他们的行为也会一样?
答案 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未正确初始化,则存在分段错误的范围。