想象一个这样的函数:
function(Human *&human){
// Implementation
}
你能解释一下 *& 到底是什么吗?它会用来做什么?与仅传递指针或引用有何不同?你能提供一个小的解释性样本吗?
谢谢你。
void doSomething(int &*hi);
不管用。您不能指向参考。然而,这:
void doSomething(int *&hi); // is valid.
它是对指针的引用。这很有用,因为您现在可以将此指针传递给函数以指向其他“人类”类型。
如果您查看此代码,它会将“hi”指向“someVar”。但是,对于传递给这个函数的原始指针,什么都不会改变,因为指针本身是按值传递的。
void doSomething(int *hi)
{
hi = &someVar;
}
所以你这样做,
void doSomething(int *&hi)
{
hi = &someVar;
}
这样传递给函数的原始指针也被改变了。
如果您理解“指向指针的指针”,那么请想象一下,除非某物是引用,否则它可以被视为“非指针”。
它就像一个双指针。您通过引用传递指针,允许“函数”函数修改指针的值。
例如,“human”可以指向 Jeff,函数可以修改它以指向 Ann。
Human ann("Ann");
void function(Human *& human)
{
human = &ann;
}
int main()
{
Human jeff("Jeff");
Human* p = &jeff;
function(p); // p now points to ann
return 0;
}
“获取指针的地址” - 不,它没有。它需要引用一个指针。
但是,这是一个语法错误。你可能的意思是
rettype function(Human *&human)
(是的,它也缺少返回类型......)
由于您是在脑海中写下这段代码,所以我假设您打算做这样的事情:
void f(T *&) {}
此函数签名允许传递的指针变为可修改的,这是替代语法所不允许的int *
。正如其他人在这里所说的那样,指针通过引用有效地传递。
使用这种语法,您现在可以修改实际指针,而不仅仅是它指向的指针。例如:
void f(int *& ptr) {
ptr = new int;
}
int main() {
int * x;
f(ptr); // we are changing the pointer here
delete x;
}
摘要(假设类型在参数中):
T *
: 我们只能改变指针指向的对象的值。更改参数不会更改传递的指针。T *&
: 我们现在可以改变实际的指针T
,以及它所指向的对象的值*T
。尽管它看起来就像地址操作符,但它不是——它是一个引用参数。当您希望能够在调用者端更改值时,您可以使用引用。在这种情况下,指针可能正在函数内设置或更改。