【问题标题】:pointers don't change after i modified it我修改后指针不会改变
【发布时间】:2020-01-02 07:11:31
【问题描述】:

我正在建立一个名为 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替换old->parent->right,那么在函数调用之后,节点me1保持不变。在函数内部对指针进行操作后,指针不是被修改了吗,为什么在这种情况下不是?

【问题讨论】:

    标签: c pointers scope


    【解决方案1】:

    meme1me2 是外部函数内部的局部变量(假设它是 main)。这些指针永远不会被修改,所以在调用test 之后,me1 仍然指向同一个节点,而指针me1->parent->right 现在指向me。所以,“me1 and me1->parent->right point are the same address”不再是真的了!

    如果你只修改oldtest里面,你只会修改参数old,它是me1的一个副本。 test返回后,这个副本忘记了,修改没有效果。如果您想从test 中修改me1 变量,您必须将指针传递给该指针,即双指针:

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

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

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

    【讨论】:

    • 等等,在 test() 之后,me1->parent->right 指向我,但是 me1->parent->right 不是和 me1 一样吗?因此,me1 是否也应该指向我? me1->parent->right 和 me1 不是同一个对象吗?
    • “难道 me1->parent->right 和 me1 不是同一个对象” - 不!它们是两个不同的指针变量,在me->right = me1; 赋值之后恰好指向相同的node,即最初分配给me1 的那个。在old->parent->right = new 赋值之后,me->right 现在指向me,但me1 仍然指向同一个东西。您的代码中没有任何地方有 me1 = something 赋值,所以 me1 总是指向同一个东西。我认为您对指针的工作方式有一个基本的误解,也许可以阅读一本好的 C 书籍中的相应章节...
    【解决方案2】:

    这是您的 test() 方法的作用:

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

    当你调用它时:

    me->right = me1;
    me1->parent = me;
    test(me1,me);
    

    这些步骤发生:

    1. me1parentmemerightme1。所以me的权限又变成了me
    2. meparent 变为 me 本身。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 2020-02-03
      • 1970-01-01
      相关资源
      最近更新 更多