更改函数中传递的指针

标签 c pointers struct

关于双重间接寻址(指针到指针)并将其传递给函数

我无法在函数中更改指针 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/

相关文章:

c - 如果达到最大大小或单击了 "enter",如何告诉 scanf 对字符进行索引?

C 中将字符串与 int 连接

ios - 转发 UIAlertView 的可变参数

c - 汇编 x86/C - 递归二项式系数段错误/打印帕斯卡三角形

Python 结构错误

C - ‘sizeof’ 对不完整类型 ‘struct ipheader’ 的无效应用以及其他错误

c - 使用返回指针的函数声明为指针是否会导致两个指针链?

c - LLVM 字符串输入/输出

c++ - 为什么指针在 C++ 中表现得像这样

c - 尝试使用 free() 来了解它是如何工作的