未能理解指针

Failing to understand pointers?

本文关键字:指针 能理解      更新时间:2023-10-16

我有一个链表指针的向量。

每个LinkedList都有一个指向Node的头指针。这个节点当然是列表的头。

向量[3]的头部与向量[0]的头部相同。我将向量[0]的头指针更改为指向向量[1]指向的同一节点,或向量[1]的头。

然而,向量[3]的头指针从未改变。我怎样才能得到它,通过改变向量[0]的头指针,我也可以改变向量[3]的头指针?我试过两种不同的方法。没有一个奏效。

vector[0]->head=vector[1]->head;
*(vector[0]->head)=*(vector[1]->head);

不能通过一次赋值更改两个值。

在您的例子中,有vector[0]->headvector[1]->head,这两个不同的指针有两个值。只要你保持不变,当你改变另一个时,他们就会改变。

你可以使用一个额外的间接级别:

Node* commonPointer = head_of_some_list;
VectorElement { ... Node **head; }
vector[0]->head = &commonPointer;
vector[3]->head = &commonPointer;
*(vector[0]->head) = head_of_another_list;
//Now *(vector[0]->head), *(vector[3]->head) and commonPointer all eventually point to head_of_another_list;

尽管这闻起来不是一个好的设计。

我现在看不到一种简单的方法来解决你的问题(会考虑一下:)),但我认为你应该理解为什么你的代码行为与你期望的不同。我想这里我们谈论的是STL向量,也就是容器具体来说,这意味着在每个向量条目内都有一个链表头的副本,因此修改vector[i]中指针的副本内容我的两分钱:使用带有key=head指针的地图是否适合您的需要?还是你真的需要不同的元素来追踪同一个列表?希望这能帮助

Ciao CiaoSergio

vector[0] = &HeadA; &HeadA->head points to Node A
vector[1] = &HeadB; &HeadB->head points to Node B
vector[3] = &HeadC; &HeadC->head points to Node A

如果将vector[0]->head更改为指向Node B,则不会更改vector[3]->head的内容,因为它是一个完全独立的变量。

您必须设置vector[3]=vector[0],而不是设置vector[3]->头指向节点A。这意味着矢量的第一个和第四个元素包含指向同一Head对象的相同指针:

vector[0] = &HeadA; &HeadA->head points to Node A
vector[1] = &HeadB; &HeadB->head points to Node B
vector[3] = &HeadA; &HeadA->head points to Node A

我认为您真正的问题是不能很好地理解指针和链表。指针可能有点难以理解。不过,我会尽力回答你的问题。

首先,注意C++和Java中的指针的作用不同,指针可以归结为按引用传递和按指针传递。

通过引用传递表示所做的更改将被保留,通过指针传递将创建一个更改不会是永久性的副本。

此外,据我所知,vector[0]->head vector[3]->head指向相同的内存地址,但后来更改了vector[0]->head指向的内容。这不会更改为vector[3]->head,因为它仍然指向之前指向的内存地址vector[0]-->head。

如果你想让它们指向同一个位置,你就必须指向向量[3]->头到向量[1]->头。

希望我能帮上忙(我是新来的堆栈溢出)。