函数参数列表

时间:2015-06-14 18:13:56

标签: c++ pointers memory-address

我在一些代码中看到了这一点,我对一件事情感到困惑:

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)不在哪里?

2 个答案:

答案 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)