关于双重间接寻址(指针到指针)并将其传递给函数
我无法在函数中更改指针 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);
测试
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是函数中的本地副本,并在列表中进行遍历,最后合并两个节点,没有问题
那么为什么在这里可以更改指针,但在函数 test(int **nPptr, int *n2Ptr) 中却不起作用?
说清楚
在函数测试中:
int *p = *nPptr;
p是本地副本,从*nPtr复制指针
在函数remove_by_index
Person *current = *head;
current是本地副本,从*head复制指针。该列表超出了函数remove_by_index(..) 的范围,所以我不明白为什么它可以在函数中通过本地指针 *current 进行操作,同时它不能在函数 test( 中改变 nPtr ) ..)
最佳答案
在函数中,对指针变量或指针参数的更改在函数外部不会产生任何影响。但是,如果指针指向函数外部的对象,则可以通过取消引用指针来修改该对象。
例如,在OP的test
函数中:
void test(int **nPptr, int *n2Ptr) {
int *p = *nPptr;
p = n2Ptr;
}
p
被初始化,然后通过赋值更改其值。这对函数之外的任何对象都没有影响。如果函数改成如下:
void test(int **nPptr, int *n2Ptr) {
int *p = *nPptr;
p = n2Ptr;
*nPptr = p;
*p = 42;
}
然后函数外部的两个对象将被修改(int *
和 int
)。
在OP的remove_by_index
函数中,对current
变量在链表中进行时的更改没有外部影响,但行:
current->next = temp_node->next;
相当于:
(*current).next = (*temp_node).next;
current
在链表上指向的外部 Person
对象已通过取消引用指针并分配给 next
进行修改它所指向的 Person
的成员。
关于更改函数中传递的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61481180/