Когда вы передаете указатель (единственный) в функция, она передается по значению. Итак, у вас в основном есть копия указателя, который вы передали в функцию, и если вы его изменяете, он не изменяет исходный указатель, который был передан, - вызывающий не увидит его.
Если вы передаете указатель на указатель, вы можете удалить его, чтобы вы могли изменить исходный указатель, который был передан вызывающим.
В вашем случае * ppNode = новый узел; присваивает новый узел указателю, который прошел пользователь (т. е. указатель, на который указывает указатель на указатель) ... Я знаю, это звучит ужасно, но вы можете его вычеркнуть, и это имеет смысл.
Вы устанавливаете данные и следующее значение этого нового указателя на значение из исходного списка. Теперь вы хотите перейти к следующему элементу. Итак, вы передаете рекурсивному вызову следующий элемент исходного списка и следующий элемент нового списка, который вы создаете. Итак, вы хотите передать указатель на «следующий» указатель только что созданного элемента.
- Узел, который вы только что создали, - * ppNode (de-referenced the pointer).
- Следующий узел в списке после * ppNode является членом
->next
.
- Указатель на следующий член - это то, что вы получаете, когда принимаете адрес следующего члена.
Итак, &(*ppNode)->next
- @StenSoft уже предоставил полный вызов, хотя.
'& (* ppNode) -> next' будет вашим вторым параметром. И если вы считаете * реальным * глубоким, вы увидите '(* ppNode) -> next = NULL;' не требуется, если вы добавите условие 'else' против' if (node) ', который просто делает' * ppNode = NULL'. – WhozCraig