C ++将链表传递给函数并通过不同方式进行更改

时间:2013-12-03 15:16:12

标签: c++ list

我必须编写一个函数,它不仅可以与复制的实例一起使用链表,还可以使用原始实例。 这是我尝试过的:

/* Want to change the real instance */
void fun1 (MyList *list)
{
list = list->next; // working with local copy
*&list = *&list->next; // changes the real instance, but it doesn't work..Why?
}

/* Want to change AS local copy */
void fun2 (MyList *&list)
{
list = list->next; // changes the real instance, works fine.
// ..And there I want to make some changes AS with local copy..How?
}

我希望你理解我的意思。 :)有什么想法吗?

2 个答案:

答案 0 :(得分:3)

&list为你提供局部变量的地址,这是堆栈中参数的位置,然后你再次推荐它。所以你还在制作本地副本。

您需要传递列表的地址,方法是将签名更改为

  void fun1 (MyList **plist);
  void fun1 (MyList *&plist);

能够修改列表本身。

答案 1 :(得分:0)

*&list = *&list->next; // changes the real instance, but it doesn't work..Why?

它不起作用,因为它获取传递给函数的参数的地址(即本地副本),然后取消引用该地址以引用本地副本。

您的第二个版本(传递对指针的引用)使得本地副本变得容易:

auto local = list;

或:

MyList *local = list;

......两者都可以。