关于双间接(指针到指针)和将这些传递给函数的问题
在函数中,我不能改变这里的指针。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.orgenLinked_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拷贝指针。
在函数中 移除_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
).
在上文中 remove_by_index
功能,改变为 current
变量在链接列表中前进时没有任何外部影响,但这一行。
current->next = temp_node->next;
相当于:
(*current).next = (*temp_node).next;
外在的 Person
的对象 current
指向链接列表的指针已经被取消引用并赋值给了 next
成员 Person
它所指向的。