Должны ли параметры указателя передаваться по ссылке

0

У меня очень простой Связанный список. Моя addNode(Node* &list, int value) добавляет новый узел в свой Связанный список, если я передаю свой список по ссылке. Если я addNode(Node* list, int value) свой список по значению, это не так: addNode(Node* list, int value).

Я знаю, что pass by value и pass by reference, но я думал, что параметр функции указателя по сути передается по ссылке, потому что указатель указывает на ячейку памяти (является ссылкой на экземпляр). Поэтому я думал, что & является избыточным, не так ли? Или я ошибаюсь?

class Node
{
public:
    Node* next;
    Node* prev;
    int   value;

    Node(int nValue=0) : next(NULL), prev(NULL), value(nValue) { }
    ~Node() { cout << "Deleting " << value << endl; }
};

// Why do I need to pass by reference 'list'?
// If I dont then the variable 'linkedList' (in main) doesn't have nodes added to it
void addNode(Node* &list, int value)
{
    Node* newNode = new Node(value);
    newNode->prev = list;
    list->next    = newNode;
    list          = newNode;
}

int main()
{
    Node* linkedList = new Node(1);
    addNode(linkedList, 2);

    // TODO: release memory

    system("PAUSE");
    return 0;
}
  • 2
    Не путайте ссылку на указатель с тем, на что указывает указатель. Его указатель в начале списка нужно изменить как параметр in / out. То, на что он указывает, модифицируется только для установки обратного указателя на новый узел.
  • 0
    Если ваша функция изменяет сам указатель, а не только указанное значение, вам нужно передать его по ссылке.
Теги:
pointers

3 ответа

1
Лучший ответ

Ваше утверждение "параметр функции указателя по сути передается по ссылке" не совсем верно. Вы должны учесть, что когда вы передаете указатель на функцию, а указатель указывает на что-то, вы действительно передаете две вещи:

  • указатель
  • pointee

Поэтому, если указатель передается по значению, у вас есть:

  • указатель прошел по значению
  • указатель прошел по ссылке

В этом случае вы можете изменить в функции pointee, но вы не можете изменить указатель.

Если указатель передан по ссылке, у вас есть:

  • указатель, переданный по ссылке
  • указатель прошел по ссылке

В этом случае вы можете изменить оба указателя и указателя.

2

Это зависит. В вашем случае, когда вы меняете указатель внутри функции, тогда да, вы должны передать указатель по ссылке. Если, с другой стороны, вы не меняете указатель внутри функции, тогда нет причин добавлять другой уровень косвенности и передавать по ссылке.

И нет, указатели не передаются автоматически по ссылке, они передаются по значению, как и любой другой аргумент. Если вы не пройдете по ссылке, указатель будет скопирован, и вы будете работать только с копией, а не с оригиналом.

2

Ссылка здесь необходима, потому что вы пытаетесь изменить указатель, а также указатель.

Если вы передадите Node по указателю, вызывающий объект увидит любые изменения указателя, но не указателя, так как копия указателя создается при вызове функции. Если вы передадите ссылку Node по указателю, вызывающий будет видеть изменения для обоих.

  • 1
    Ах, я вижу, что копия linkedList изменяется, но не связанный linkedList .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню