c - 无法理解用于链表的指针
问题描述
在链表中,如果start
是头节点,并且同一个节点的任何临时节点指针都是 say temp
,那么这个赋值实际上是什么意思:
temp = start;
这是否意味着 start 的地址放在 temp 中还是什么?
这些分配也用于许多其他节点,这让我很困扰。
解决方案
我将不得不在这里填写一些细节,因为它仅暗示在您的问题中可以找到哪些细节。列表的基本形式是:
struct list_node {
void *data;
struct list_node *next;
};
您的问题似乎是关于指向与此类似的列表的两种相同的指针类型。 IE
struct list_node *start, *temp;
此外,您声明start
“是头节点”,我假设这意味着它也是一个指针,它指向列表的头。为了简单起见,我假设这个头节点存储在堆栈中:
struct list_node head = { NULL, NULL };
start = &head;
现在到你的实际问题:
这个任务实际上意味着什么
temp = start;
这只是制作指针的副本start
并将其存储在另一个名为temp
. 因为在我的示例中,start
指向head
,现在temp
也指向head
。没什么特别的。它只是两个命名的值start
,temp
它们都恰好引用相同的内存位置(在这种情况下,存储的内存区域head
)。
您会在与列表相关的代码中经常看到这一点的一个原因是,您通常只有一个指向列表开头的指针,但您还需要遍历列表以对每个节点执行某些操作。您不能只修改该指针的一个副本,因为您可能想稍后使用它。因此,您只需将其存储在另一个变量中(在本例中为temp
)并在迭代时修改该变量。 例如
for(temp = start; temp != NULL; temp = temp->next)
{
// ...
}
这是否意味着 start 的地址放在 temp 或什么
虽然我已经解决了你的问题,但我想特别强调一下这个关于你的问题的问题。
答案是否定的: 的地址是指向指针的指针(在这种情况下,它的类型是start
)。&start
struct list_node **
相反,您可以说所持有的 start
地址存储在 temp
.
推荐阅读
- terraform - Terraform:将var传递给函数
- java - 在java中编译文件
- delphi - EDoubleFree 错误罕见异常的原因有哪些?
- azure - 使用 ARM 模板部署在 Azure Front Door 自定义域上启用 HTTPS
- python - 哪个是更好的解决方案?(异常处理)
- javascript - 如何从父组件调用子组件方法
- verification - Multiset 仅使用一个元素数组进行验证
- excel - 使用 VBA 密码保护进行保存时出现错误消息“运行时错误‘1004’:对象‘_Workbook’的方法‘SaveAs’失败”
- java - Java Biginteger 在 pow 中的最大值
- kubernetes - 使用 Rancher 设置本地 kubectl