我想知道以下指针等于什么?

时间:2019-06-04 11:56:55

标签: 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;

*(ptr1) = *(ptr2);

node* temp;
temp = ptr1;

while (temp != NULL)
{
    cout << temp->data << " ";
    temp = temp->next;
}

我希望输出为:

  

2 2 3

即,ptr地址处的值现在应等于ptr2地址处的值,因为ptr1ptr2实际上指向节点的数据部分..(如我通过打印地址值所见)

但是输出是:

  

2 3

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

  

2

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

5 个答案:

答案 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