*ptr2 = ptr 是什么意思?

What does *ptr2 = ptr mean?

我目前正在为我的 类 之一开发双向链表。我们的一项压力测试如下所示:

//Delcarations
DLList<string> list;
DLList<string>* list2;

list.clear();                         //Clears the list
list2 = &list;                        //Sets the values to be the same
list.addHead("I'm meant to be here"); //Adds this as head of both lists
*list2 = list;                        //Unsure what this does
printFunc(*list2);                    //prints the contents of the list

我的输出框只显示 listlist2 变成 NULL,当我打印 *list2 时,它打印 NULL.

我的问题是:

  1. *list2 = list实际上在做什么?
  2. 为什么我的值都变成 NULL?

*list2 = list 正在更改 数据的值 指针 list2 指向。指针前面的运算符 * 将引用存储在指针中的地址处的数据(称为 dereferencing)。

基本上 list2 是一个指针,它存储一个地址,该地址在内存中指向 list 所在的位置(这发生在您编写 list2 = &list 时)。您使用*list2转到存储在地址的数据,并在声明*list2 = list;.[=20=时将其更改为list ]

您的两个评论不正确。也许更正的评论会使情况更清楚? (我假设函数名称表明了它们的用途,尽管这样的假设并不总是准确的。)

list2 = &list;                        //Sets the values to be the same

不,这会导致 list2 指向您刚刚清除的列表。只有一个列表,列表中只有一组值。

list.addHead("I'm meant to be here"); //Adds this as head of both lists

不,只有一个列表。这会将 "I'm meant to be here" 添加到 列表的头部。

*list2 = list;                        //Unsure what this does

这会获取 list2 指向的列表(a.k.a。list 前两行)并将其内容替换为 list 的内容。也就是说,它以一种可能不会被编译器检测到的方式执行自赋值,因此可能会避免被优化掉。 (它也可能不会被试图通过压力测试的学生检测到。;))但是从逻辑上讲,这条线在功能上与 list = list;.

相同
printFunc(*list2);                    //prints the contents of the list

这会打印空值?这表明您的赋值运算符没有正确处理自赋值。