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、 eptr
地址处的值现在应该等于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