Это все довольно простой C, поэтому я постараюсь быть максимально понятным, но я предлагаю вам внимательно прочитать справочники по этой теме.
Этот код определяет структуру stackNode
, котораясодержит некоторые данные и «указатель» на эту же структуру.
Поскольку stackNode
является структурой, когда вы передаете ее в качестве параметра функции, компилятор создает ее копию и передает еефункция. Это называется «передачей параметра копией». Пример:
StackNode node;
foo(node) ;
void foo(StackNode n) {
/* foo() function can use the parameter n which is a local copy of node.
you can modify n in the foo() function, that will not modify the node variable */
}
Это означает, что функция не может изменять ваши исходные данные. Он может изменять локальную копию функции, которая теряется в конце функции.
Если вы хотите изменить данный параметр, вы должны передать параметр «по адресу», а не «по копии». Вы делаете это следующим образом:
StackNode node;
foo(&node) ;
void foo(StackNode *n) {
/* foo() function accesses the node variable via its address n. (*n) represents
the content at address n, which is node. */
}
В этом коде функция foo () получает адрес StackNode (а не копию StackNode). «Отказавшись от ссылки» на адрес, вы можете получить доступ к содержимому, на которое «указывает» указатель, и, следовательно, изменить его «по-настоящему». «Разыменование» выполняется оператором «*», а оператор «&» дает «ссылку» (адрес) переменной.
Итак, теперь к вашему коду. Я отвечу на ваши вопросы в несколько ином порядке, чтобы прояснить его (я думаю).
Что делает void push(StackNodePtr *topPtr, int info)
, так это назначает новый узел, делает его указателем на текущий topPtr, а затем модифицируетtopPtr указывает на этот новый узел.
Поэтому он изменяет topPtr.
Поэтому topPtr должен передаваться по ссылке.
Поэтому вам нужно void push(StackNodePtr *topPtr, int info)
, а не void push(StackNodePtr topPtr, int info)
Поэтому вам нужно вызвать его с push(&stackPtr ,value)
Если вы позвоните push(stackPtr ,value)
, то:
- Прежде всего, ваш компилятор должен пожаловаться (по крайней мере, поднять предупреждение)
- В тот или иной день вы потерпите крах, так как будете изменять неизвестные зоны памяти
Теперь вы должны также понять, почему вам нужно (*topPtr) = newPtr
вместоtopPtr = newPtr
. Поскольку вы хотите изменить stackPtr, и вам нужно отменить ссылку на topPtr.
То же самое в последнем коде.
Тем не менее, я могу думать о том, что реализовать стек намного проще ... ; -)