我有以下代码:
struct node {
int data;
node* next;
};
node* ptr1 = new node;
node* ptr2 = new node;
node* ptr3 = new node;
ptr1->data = 1;
ptr1->next = ptr2;
ptr2->data = 2;
ptr2->next = ptr3;
ptr3->data = 3;
ptr3->next = NULL;
*(ptr1) = *(ptr2);
node* temp;
temp = ptr1;
while (temp != NULL)
{
cout << temp->data << " ";
temp = temp->next;
}
我希望输出为:
2 2 3
即,ptr
地址处的值现在应等于ptr2
地址处的值,因为ptr1
和ptr2
实际上指向节点的数据部分..(如我通过打印地址值所见)
但是输出是:
2 3
我希望得到我的输出,因为当我打印*(ptr2)
时(使用printf
而不是cout
; cout
显示错误),我得到的输出为:
2
请有人解释发生了什么。
*ptr1 = *ptr2
做什么?
答案 0 :(得分:6)
*(ptr1) = *(ptr2);
在这种情况下等同于:
ptr1->data = ptr2->data
ptr1->next = ptr2->next
那是您结构的所有成员都将被更改,因此您的ptr1->next
不再指向ptr2
节点,而是直接指向ptr3
,这就是为什么只打印两个值而不是打印两个值的原因3
您从此出发:
[ptr1]==>[ptr2]==>[ptr3]
对此:
[ptr2]==>[ptr3]
[ptr1]==>[ptr3]
答案 1 :(得分:2)
*(ptr1)= *(ptr2);复制数据,下一个ptr破坏链接列表。 您只想复制数据。 所以应该是
ptr1->data = ptr2->data
答案 2 :(得分:1)
在此声明中
*(ptr1) = *(ptr2);
指针struct node
所指向的ptr2
类型的对象被分配给指针struct node
所指向的相同类型ptr1
的对象。
因此,您拥有
ptr1 -> { 2, ptr3 }
ptr2 -> { 2, ptr3 }
ptr3 -> { 3, nullptr }
因此在从ptr1
temp=ptr1;
while(temp!=NULL)
{
cout<<temp->data<<" ";
temp=temp->next;
}
显示两个ptr1
指向的对象(依次指向ptr3
)和ptr3
指向的对象。
指针ptr2
指向的对象中对ptr1
的引用丢失。现在,对象的数据成员next
直接指向指针ptr3
指向的对象。
答案 3 :(得分:1)
ptr1 -> ptr2 -> ptr3
1 2 3
完成*(ptr1)= *(ptr2)时,结构如下:
ptr1 -> ptr3
2 3
^
|
|
ptr2
2
希望很清楚为什么现在可以打印23 :)
答案 4 :(得分:0)
*(ptr1) = *(ptr2);
此处您要更改的基础内存位置
ptr1
恰好是ptr2
的{{1}},具有从ptr2
开始迭代的效果(这就是输出为2 3的原因)。
如果您希望输出为2 2 3
您将必须在ptr1处更改 data :
ptr1->data = ptr2->data