gpt4 book ai didi

c - 修改后指针没有改变

转载 作者:行者123 更新时间:2023-11-30 14:36:58 24 4
gpt4 key购买 nike

我正在设置一个名为 Node 的结构

    typedef struct node{
struct node *left;
struct node *right;
struct node *parent;
}node;

以及在节点上运行的函数:

   int test(node *old,node* new){
old->parent->right = new;
new->parent = old->parent;
}

好的,所以我创建了3个节点并设置它们之间的关系

node* me =malloc(sizeof(node));
node* me1 = malloc(sizeof(node));
node* me2 = malloc(sizeof(node));
me->right = me1;
me->left = me2;
me1->parent = me;
me2->parent = me;
test(me1,me);

1.然而,在test()之后,me1->parent->right改变了,而me1没有改变,这很奇怪,因为me1和me1->parent->right点是相同的地址。我想知道我在这里是否做出了错误的假设?

2.在函数test()中,如果我仅将old->parent->right替换为old,则在函数调用之后,节点me1保持不变。我们在函数内对指针进行操作后,指针是否没有被修改,为什么在这种情况下它没有被修改?

最佳答案

meme1me2 是外部函数内的局部变量(假设它是 main )。这些指针永远不会被修改,因此在调用 test 之后,me1 仍然指向与之前相同的节点,而指针 me1->parent->right 现在指向。因此,“me1 和 me1->parent->right 点是相同的地址”不再成立!

如果在test中只修改old,则只会修改参数old,它是me1<的副本test返回后,这份副本就被遗忘了,修改也没有效果。如果您想在 test 中修改 me1 变量,则必须传递一个指向该指针的指针,即双指针:

int test(node **old,node* new){
*old = new;
...
}

并将其命名为test(&me1,me);

另外:请不要将事物命名为“new”,因为如果您决定将代码编译为 C++,这将与保留关键字 new 发生冲突。

关于c - 修改后指针没有改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57702879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com