关于指针的引用的问题

我遇见了一个bug是这样的:一个node结点包含node * left和node * right两个指针域。

void fun(node * &a, node * b) {
    b->right = a->right;
    b->left = a;
    a->right->left = b;
    a->right = b;
}

当我以fun(x->left, y)调用这个函数时,会发现指针不能指向正确的位置。

几经排查后,我发现是指针的引用的问题。因为我调用fun的时候,第一个参数给的是x->left,所以引用实际上绑定到了x所指向的那片空间的left域。

接着问题就来了,函数fun()的第三行,a->right->left实际上就是x->left的这片区域,因此将其设置为b的时候,就相当于把a设置为了b。因此无法通过a访问x->left了,因为x->left已经等于b了。

解决这个问题可以用加一句node * c = a;将引用去掉,这样即使a被改变了,c还是指向了x->left。

原文地址:https://www.cnblogs.com/yxsrt/p/12208618.html