无法弄清楚指针的行为

时间:2018-02-20 20:35:01

标签: c++ pointers

我无法弄清楚为什么temp->next=NULL打破了原始链接列表

我的代码在这里:

struct Node{
    int data;
    Node* next;
};

Node* createNode(int data)
{
    Node* temp=new Node;
    temp->data=data;
    temp->next=NULL;
    return temp;
}

int main()
{
Node* root=createNode(1);
root->next=createNode(2);
root->next->next=createNode(3);
display(root);
cout<<"\nAddress of root = "<<&root<<"-> "<<&(root->next)<<"-> "<<&(root->next->next);

Node* temp=root;
temp->next=NULL;  //Trying to set next pointer to Null in temp list but instead it is impacting the original list by nullifying the next node. Why is it so ?
display(temp);
cout<<"\nAddress of temp = "<<&temp<<"-> "<<&(temp->next);
display(root);  // Original list broke
}

输出:

Linked list => 1->2->3
Address of root = 0x7ffd3afbc2f0-> 0x5605aff6cc28-> 0x5605aff6cc48
Linked list => 1
Address of temp = 0x7ffd3afbc2f8-> 0x5605aff6cc28
Linked list => 1

2 个答案:

答案 0 :(得分:3)

考虑指针int* ptr;和整数int var;。同样地,&var是整数的地址并且与它的值不同,&ptr是指针的地址,并且与它的值不同(它指向的 到)。

表达式Node* temp=root;正在创建一个与temp具有相同值的指针root,它们引用同一个对象。 temproot是不同的对象,地址不同(&root&temp不同),但它们具有相同的值(root和{{1是等于)。因此temptemp->next是相同的指针。改变一个将改变另一个。

在您的示例中,只存在一个链接列表,root->nextroot都引用了这些链接列表。

答案 1 :(得分:0)

指针只指向内存中的某个位置,因此就是它们的名字。当你这样做时:

Node* temp=root;

创建一个指针temp指向与指针root相同的内存位置。所以这个:

temp->next=NULL;

和此:

root->next=NULL;

做同样的事情,因为temp->nextroot->next是相同的。