考虑这个例子:
void MyFunction(int &x){...}
void MyOtherFunction(int *x){...}
int main()
{
int my_variable = 10;
MyFunction(my_variable);
MyOtherFunction(&my_variable);
}
我是否正确地说这些方法都是通过引用传递变量(即不创建副本),唯一的区别是MyOtherFunction正在接收指针?
答案 0 :(得分:4)
答案 1 :(得分:1)
是的,没有副本。传递指针意味着您可以传递空ptr,而使用引用则必须传递有效对象。
对于int,float和simple vars,只要不需要在函数内部更改传递的参数,传递值就不会更贵。
答案 2 :(得分:1)
在您的示例中,您永远不会复制my_variable
(虽然您在调用void MyOtherFunction(int *x){...}
时正在复制指针,但这很好。)
这两个函数之间的重要区别是MyFunction(int &x)
是一个正确的C ++引用,并且永远不会为null(在普通代码中),而你可以传递nullptr MyOtherFunction(int *x)
,这必须在运行。也可以根据需要在MyOtherFunction
内重新分配指针版本。
答案 3 :(得分:1)
你是对的。在两个调用中,您通过引用传递变量。但是,这个术语在C ++中的引用与C中的相同术语不同。
在C中,当有人说他通过引用传递参数时,意味着它传递了一个指向变量的指针。
在C ++中,引用具有新的含义。它们是语言规范的一部分。因此,当有人说他通过引用传递参数时,通常意味着相应的参数被声明为引用。:)
答案 4 :(得分:1)
按引用传递是orignal object
的别名。传递指针创建额外变量以保存original object
的地址。