修改后指针不会改变

时间:2019-08-29 04:13:58

标签: c pointers scope

我正在建立一个名为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保持不变。在函数中对指针进行操作后,指针是否没有修改?为什么在这种情况下没有修改指针?

2 个答案:

答案 0 :(得分:1)

parentmefor I := 0 to L1.Count - 1 do begin found := false; L := ListView1.Items.Add; for J := 0 to L2.Count - 1 do begin LSplit.Clear; ExtractStrings(['|'], [], PChar(L2[J]), LSplit); if L1[I] = LSplit[0] then begin L.Caption := LSplit[0]; L.SubItems.Add(LSplit[1]); found := true; Break; end; end; if not found then L.Caption := L1[I]; end; 是外部函数内部的局部变量(假设它是me)。这些指针永远不会被修改,因此在调用me1之后,me2仍指向与以前相同的节点,而指针main现在指向test。因此,“ me1和me1-> parent->正确的点是相同的地址”不再正确!

如果仅在me1内修改me1->parent->right,则将只修改参数me,它是old的副本。 test返回后,该副本将被遗忘,并且修改无效。如果要在old中修改me1变量,则必须将指针传递给该指针,即双指针:

test

并命名为me1

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

答案 1 :(得分:0)

这是您的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. me1的{​​{1}}是parent,而me的{​​{1}}是me。因此right的权利再次变为me1
  2. me的{​​{1}}本身就是me