改变函数中传递的指针

问题描述 投票:0回答:1

关于双间接(指针到指针)和将这些传递给函数的问题

在函数中,我不能改变这里的指针。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也不行。

c pointers struct
1个回答
1
投票

在函数中,指针变量或指针参数的改变在函数外部没有影响。但是,如果指针指向函数外的对象,那么可以通过对指针的去引用来修改这个对象。

例如,在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 它所指向的。

© www.soinside.com 2019 - 2024. All rights reserved.