C++ 我想知道下面的指针等值是做什么的?

C++ 我想知道下面的指针等值是做什么的?,c++,pointers,C++,Pointers,我的代码如下: 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;

我的代码如下:

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;
}
struct节点{
int数据;
节点*下一步;
};
节点*ptr1=新节点;
节点*ptr2=新节点;
节点*ptr3=新节点;
ptr1->data=1;
ptr1->next=ptr2;
ptr2->data=2;
ptr2->next=ptr3;
ptr3->data=3;
ptr3->next=NULL;
*(ptr1)=*(ptr2);
节点*温度;
温度=ptr1;
while(temp!=NULL)
{
下一步是收集数据;
}
我期望输出为:

2 2 3

i、 e
ptr
地址处的值现在应该等于
ptr2
地址处的值,因为
ptr1
ptr2
实际上指向节点的数据部分..(如我通过打印地址值看到的)

但结果是:

2 3

我期望我的输出,因为当我打印
*(ptr2)
(使用
printf
而不是
cout
cout
显示错误)时,我得到的输出如下:

二,

请有人解释一下发生了什么事。
*ptr1=*ptr2
做什么

*(ptr1) = *(ptr2);
在这种情况下相当于:

ptr1->data = ptr2->data
ptr1->next = ptr2->next
也就是说,您的结构的所有成员都会受到影响,因此您的
ptr1->next
不再指向
ptr2
节点,而是直接指向
ptr3
,这就是为什么只打印2个值而不是3个值的原因

你从这里开始:

[ptr1]==>[ptr2]==>[ptr3]
为此:

[ptr2]==>[ptr3]
[ptr1]==>[ptr3]
在这份声明中

*(ptr1) = *(ptr2);
指针ptr2指向的
struct节点
类型的对象被分配给指针ptr1指向的相同类型的
struct节点
对象

所以你有

ptr1 -> { 2, ptr3 }
ptr2 -> { 2,  ptr3 }
ptr3 -> { 3, nullptr }
所以在这个循环中,从
ptr1

temp=ptr1;
while(temp!=NULL)
{

    cout<<temp->data<<" ";
    temp=temp->next;
}
temp=ptr1;
while(temp!=NULL)
{
cout*(ptr1)=*(ptr2);复制数据和破坏链接列表的下一个ptr。
您只想复制数据。
应该如此

ptr1->data = ptr2->data
ptr1->data = ptr2->data
在这里,您正在更改的基本内存位置
ptr1
ptr2
完全相同,具有从
ptr2
开始迭代的效果(这就是为什么输出为23)

如果希望输出为
23
您必须在ptr1更改数据:

当*(ptr1)=*(ptr2)完成时,结构如下所示:

ptr1    ->     ptr3
 2              3

                ^
                |
                |
               ptr2
                2

希望它现在打印23的原因很清楚:)

因为当你在第一个结构上爆炸第二个结构时,
数据
成员不是唯一被复制的东西。该结构中还有另一个成员。想想它包含什么。纸、铅笔/笔、盒子和箭头会非常方便,顺便说一句。将
*ptr2
传递到
打印f
具有未定义的行为。
ptr1   ->    ptr2    ->     ptr3
 1            2              3
ptr1    ->     ptr3
 2              3

                ^
                |
                |
               ptr2
                2