Как передать указатель переменной в качестве ссылочного параметра? - PullRequest
0 голосов
/ 16 сентября 2018

Когда у вас есть такая функция, формальный параметр является ссылкой, он становится другим именем для фактического аргумента, поэтому, когда мы изменяем формальный параметр внутри функции, изменяется исходная переменная вне функции.

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* с в функцию.

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

...

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

Я думаю, что адреса памяти rvalues ​​внутри переменных указателя leader и trailer будут назначены в Node* lvalues ​​ptr1 и ptr2.

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

Проблема в том, что ptr1 и ptr2 являются независимыми локальными переменными внутри функции. Первоначально они указывают на то же место, что и действительные указатели аргументов. Однако моя функция перемещает некоторые узлы, и в конце функции значения ptr1 и ptr2 изменяются. Я хочу, чтобы эти изменения также были в исходных переменных leader и trailer, как ссылки. Так что даже когда ptr1 и ptr2 истекают, leader и trailer должны идти в свои позиции.

Как бы я это сделал? Может быть, наберите указатели на int&? Или, может быть, использовать указатели на указатели? Я хочу передать указатель по ссылке, но я не уверен, как это сделать.

1 Ответ

0 голосов
/ 16 сентября 2018

Я хочу передать указатель по ссылке, но я не уверен, как это сделать.

Для этого рассмотрим следующий фрагмент

#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;
}

, в котором передается ссылка на тест, где ему присваивается значение nullptr, и программа печатает: I was passed by reference.

Я думаю, что этот пример должен прояснить, как передать указатель по ссылке на функцию.

Так что в вашем случае сигнатура функции должна измениться на

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