【问题标题】:How to pass a pointer variable as a reference parameter?如何将指针变量作为引用参数传递?
【发布时间】:2018-09-15 23:39:35
【问题描述】:

当你有这样一个函数时,形参是一个引用,它变成了实参的另一个名字,这样当我们在函数内部修改形参时,函数外部的原始变量就改变了。

void add_five(int& a)
{
    a += 5;
}

int main()
{
    int number = 3;
    add_five(number);
    std::cout << number << std::endl;  // prints 8

    return 0;
}

我有一些适用于链表的代码。我将两个Node*s 传递给函数。

void LinkedList::move_five_nodes(Node* ptr1, Node* ptr2) { ... }

...

void LinkedList::anotherFunction()
{
    Node* leader;
    Node* trailer;
    ...
    move_five_nodes(leader, trailer);
    ...
}

我认为leadertrailer 指针变量内的右值内存地址将分配给Node* 左值ptr1ptr2

Node* ptr1 = leader;
Node* ptr2 = trailer;

问题在于ptr1ptr2 是函数内部的独立局部变量。最初,它们指向与实际参数指针相同的位置。但是,我的函数移动了一些节点,并且在函数结束时,ptr1ptr2 的值发生了变化。我希望这些更改也包含在原始变量 leadertrailer 中,就像引用一样。所以即使ptr1ptr2过期,leadertrailer也应该进入他们的位置。

我该怎么做?也许将指针类型转换为int&amp;?或者也许使用指向指针的指针?我想通过引用传递一个指针,但我不知道该怎么做。

【问题讨论】:

  • 听起来你只需要重新设计你的函数move_five_nodes。然而,这有点难说。指向指针的指针可能工作得很好。我不明白使用这些有什么问题。

标签: c++ pointers pass-by-reference


【解决方案1】:

我想通过引用传递一个指针,但我不知道该怎么做。

为此,请考虑以下 sn-p

#include <iostream>

void test(int*& t)
{
    t = nullptr;
}

int main()
{
    int* i = new int(4);

    test(i);

    if (i == nullptr)
        std::cout << "I was passed by reference" << std::endl;
}

其中通过引用传递给test,设置为nullptr,程序打印:I was passed by reference

我认为这个例子应该清楚地说明如何通过引用函数来传递指针。

所以在你的情况下,函数签名必须更改为

void LinkedList::move_five_nodes(Node*& ptr1, Node*& ptr2) { ... }

【讨论】:

  • 还有一个问题:int* i = new int[4]; 创建了一个由 4 个 ints 组成的新动态数组,并将指针分配给 i,而 int* i = new int(4); 创建了一个用 4 初始化的动态整数,以及将指针分配给i。我对吗?我理解正确吗?
  • 是的,你是对的。只是获取指针的示例。
  • 也很好的双关语i was passed by reference
  • @Galaxy 不是故意的,但我同意 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-29
  • 2016-07-17
  • 2012-01-24
  • 2018-08-19
  • 1970-01-01
  • 2023-03-10
  • 2018-05-14
相关资源
最近更新 更多