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),这必须通过传递指针来完成,在这种情况下是一个指针指针或**.引用运算符允许更可读的代码和更强的类型检查.
这看起来像是在重新实现构造函数!
为什么不创建适当的构造函数?
注意在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)
可能值得解释为什么不是&*,但另一种方式.原因是,声明是递归构建的,因此对指针的引用就像构建一样
& 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)
引用指针不合法.这就是订单的原因*&,这意味着"引用指针".