通过引用混淆?

Pass by reference confusion?

考虑这个例子:

void MyFunction(int &x){...}

void MyOtherFunction(int *x){...}

int main()
{
  int my_variable = 10;
  MyFunction(my_variable);
  MyOtherFunction(&my_variable);
}

我说的这两种方法都是通过引用传递变量(即不创建副本),唯一的区别是 MyOtherFunction 正在接收指针吗?

你说得对,你没有复制 my_variable,而是复制 pointer is not a reference,它们是两组不同的类型。

例如指针可以为空,可以调用MyOtherFunction(nullptr).

是的,没有副本。传递指针意味着你可以传递一个空指针,而使用引用你必须传递一个有效的对象。

对于 int、float 和简单的变量,按值传递并不更昂贵,前提是您不需要在函数内部更改传递的参数。

在您的示例中,您从不复制 my_variable(尽管您在调用 void MyOtherFunction(int *x){...} 时复制了一个指针,但这没关系)。

这两个函数之间的重要区别在于 MyFunction(int &x) 是一个正确的 C++ 引用并且永远不会为空(在正常代码中),而您可以传递 nullptr MyOtherFunction(int *x),并且这必须是在运行时检查。指针版本也可以根据需要在MyOtherFunction里面重新赋值。

你是对的。在这两个调用中,您都通过引用传递变量。但是,C++ 中的引用术语与 C 中的相同术语不同。

在 C 中,当有人说他通过引用传递参数时,这意味着它传递了一个指向变量的指针。

在 C++ 中,引用具有新的含义。它们是语言规范的一部分。因此,当有人说他通过引用传递参数时,通常意味着相应的参数被声明为引用。:)

按引用传递是 orignal object 的别名。通过指针传递创建额外的变量来保存 original object.

的地址