Почему мне нужно использовать двойной указатель вместо одиночного для добавления нового значения в связанный список в C? - PullRequest
0 голосов
/ 08 мая 2020

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

Это работает :

void pushToList(node **listHead, int val) {
    node *temp = malloc(sizeof(node));
    temp->value = val;
    temp->next = *listHead;
    *listHead = temp;
}

Это не так:

void pushToList(node *listHead, int val) {
    node *temp = malloc(sizeof(node));
    temp->value = val;
    temp->next = listHead;
    listHead = temp;
}

Разве это не то же самое после разыменования указателя на указатель?

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

Во втором фрагменте кода:

void pushToList(node * listHead, int val) {
    node * temp = malloc(sizeof(node));
    temp->value = val;
    temp->next = listHead;
    listHead = temp;
}

Вызывающий передает указатель на узел, называемый listHead. Этот указатель передается по значению. Например:

node *myNode;
// ...
pushToList(myNode, 123);

Последняя строка функции перезаписывает локальную переменную listHead, но это не влияет на значение вызывающей стороны (здесь myNode). Фактически, значение, переданное функции, может даже не быть lvalue: рассмотрим следующий пример:

node nn; // stack-allocated
pushToList(&nn, 123); 

Правильное решение, которое вы предоставляете в первом примере, - это передать указатель на указатель на узел, чтобы функция pu sh могла обновлять этот указатель на узел.

1 голос
/ 08 мая 2020

temp - это указатель
поэтому listHead это должен быть указатель i для него, что означает добавление дополнительного указателя

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...