Относительно двойной косвенности (указатель на указатель) и передачи их в функцию
Я не могу изменить указатель здесь в функции void test (int ** nmbr, int * n);
int n = 5;
int n2 = 555;
int *nPtr = &n;
int *n2Ptr = &n2;
printf("the number = %d\n", *nPtr);
test(&nPtr, n2Ptr);
printf("the number is now = %d\n", *nPtr);
test
void test(int **nPptr, int *n2Ptr) {
int *p = *nPptr;
p = n2Ptr;
}
, поскольку указатель p указывает на копию * nPtr, верно?
Но как насчет этого кода (на этот раз указатель указывает для данной структуры в связанном списке
фрагмент кода взят с сайта https://www.learn-c.org/en/Linked_lists
int remove_by_index(Person **head, int n) {
int i = 0;
int retval = -1;
Person *current = *head;
Person *temp_node = NULL;
if (n == 0) {
return pop_first(head);
}
for (i = 0; i < n-1; i++) {
if (current->next == NULL) {
return -1;
}
current = current->next;
}
temp_node = current->next;
retval = temp_node->nmbr;
current->next = temp_node->next;
free(temp_node);
return retval;
}
удаляет указанный узел в списке по указанному номеру индекса
Здесь можно увидеть, что * current является локальной копией в функции и перемещается по списку и, наконец, объединяет два узла без проблем
Так почему же работает изменение указателя здесь, но не в тесте функции (int ** nPptr, int * n2Ptr)?
Чтобы быть понятным
в функции test :
int *p = *nPptr;
p является локальной копией и копирует указатель из * nPtr
в функцию remove_by_index
Person *current = *head;
* 10 40 * current является локальной копией и копирует указатель с * head. Список выходит за рамки функции remove_by_index (..), поэтому я не понимаю, почему им можно манипулировать в функции с помощью локального указателя * current, в то же время он не работает для изменения nPtr в тесте функции ( ..)