我在一些代码中看到了这一点,我对一件事情感到困惑:
struct mystrct {...};
typedef mystrct* ptr_mystrct;
void fun1(ptr_mystrct &val)
{...}
void fun2(ptr_mystrct val)
{...}
main()
{
mystrct foo;
ptr_mystrct ptr_foo = &foo;
fun1(ptr_foo);
fun2(&foo); //this works fine
fun1(&foo); //this is NOT valid (compiler error)
}
&
之前val
的目的是什么?起初我以为它会将地址指向指针(val
将指向ptr_foo
位置),但它显然没有。
另外,为什么fun2(&foo)
编译fun1(&foo)
不在哪里?
答案 0 :(得分:2)
删除typedef
,我们有:
void fun1(mystrct*& val);
fun1(&foo);
fun1
对指向mystrct
的指针进行左值引用。 &foo
确实是指向mystrct
的指针,但它是一个rvalue(特别是一个prvalue),而不是一个左值,因此类型不匹配。您可以将其视为&foo
是临时值,并且您不能将非常量左值引用作为临时值。
这是尝试执行以下操作的等效错误:
void fun(int& );
fun(1);
fun2
只需要一个指针 - 而不是引用 - 所以fun2(&foo)
完全正常。
答案 1 :(得分:1)
它将参数声明为引用。参数变为in / out而不是C ++ / C的正常值。
这会更新传递给函数的结构。
void fun1 (ptr_mystruct &val)
{
val = somevalue ;
}
这会在fun2中更新参数的副本,以便调用者永远不会看到更改。
void fun2 (ptr_mystruct val)
{
val = somevalue ;
}
这里fun2期望指针指向结构的指针。作品
fun2(&foo); //this works fine
这里fun1需要一个指向结构的指针,并且您正在向指针传递一个指针:
fun1(&foo); //this is NOT valid (compiler error)
恕我直言,这个例子有一个间接层,比fun1更需要。这是您通过引用传递的结构真正需要的:
void fun1(mystrct &val)
这是你在C的旧时代所做的事情,然后才能引用结构读/写
void fun2(ptr_mystrct val)