函数声明中的"*&"是什么意思?

bas*_*ibe 20 c++ pointers reference

我按照以下方式编写了一个函数:

void myFunc(myStruct *&out) {
    out = new myStruct;
    out->field1 = 1;
    out->field2 = 2;
}
Run Code Online (Sandbox Code Playgroud)

现在在一个调用函数中,我可能会写这样的东西:

myStruct *data;
myFunc(data);
Run Code Online (Sandbox Code Playgroud)

这将填补所有领域data.如果我省略&声明中的' ',这将无效.(或者更确切地说,它只能在函数本地工作,但不会改变调用者中的任何内容)

有人可以向我解释这*&实际上是做什么的吗?它看起来很奇怪,我只是无法理解它.

unw*_*ind 36

C++变量声明中的&符号表示它是一个引用.

它恰好是对指针的引用,它解释了你所看到的语义; 被调用的函数可以更改调用上下文中的指针,因为它具有对它的引用.

因此,重申一下*&,这里的"操作符号"不是,这种组合本身并不意味着很多.它*是类型的一部分myStruct *,即"指向myStruct",并&使其成为引用,因此您将其读作" out是对指针的引用myStruct".

在我看来,原始程序员可以通过将其编写为:

void myFunc(myStruct * &out)
Run Code Online (Sandbox Code Playgroud)

甚至(不是我的个人风格,但当然仍然有效):

void myFunc(myStruct* &out)
Run Code Online (Sandbox Code Playgroud)

当然,还有很多关于风格的意见.:)


Adr*_*aan 13

在C和C++中,&表示通过引用调用; 您允许该函数更改变量.在这种情况下,您的变量是指向myStruct类型的指针.在这种情况下,函数会分配一个新的内存块并将其分配给指针'data'.

在过去(比如K&R),这必须通过传递指针来完成,在这种情况下是一个指针指针或**.引用运算符允许更可读的代码和更强的类型检查.


Mar*_*ork 6

这看起来像是在重新实现构造函数!

为什么不创建适当的构造函数?
注意在C++中,struct就像一个类(它可以有一个构造函数).

struct myStruct
{
    myStruct()
        :field1(1)
        ,field2(2)
    {}
};

myStruct*  data1 = new myStruct;

// or Preferably use a smart pointer
std::auto_ptr<myStruct>   data2(new myStruct);

// or a normal object
myStruct    data3;
Run Code Online (Sandbox Code Playgroud)


Joh*_*itb 6

可能值得解释为什么不是&*,但另一种方式.原因是,声明是递归构建的,因此对指针的引用就像构建一样

& out // reference to ...
* (& out) // reference to pointer
Run Code Online (Sandbox Code Playgroud)

括号被删除,因为它们是多余的,但它们可以帮助您查看模式.(为了了解它们为什么是多余的,想象一下这个东西在表达式中是怎样的,你会注意到首先是地址,然后是解除引用 - 这就是我们想要的顺序,括号不会改变).如果你改变订单,你会得到

* out // pointer to ...
& (* out) // pointer to reference
Run Code Online (Sandbox Code Playgroud)

引用指针不合法.这就是订单的原因*&,这意味着"引用指针".