我最近才把自己暴露给链接列表,我很无望。 所以无论如何,我已经给出了下面的代码片段,以便让自己更好地理解。
struct node
{
int item;
struct node *next;
};
struct node *root;
struct node *conductor;
root = malloc(sizeof(struct node));
root->item = 777;
root->next = 0;
所以我的问题是,当我这样做时会发生什么:conductor = node;
?
此外,是否有区别:
conductor = node;
和
conductor = malloc(sizeof(struct node));
conductor->item = root->item;
conductor->next = root->next;
如果有差异,有什么区别?你将如何编写conductor = root;
的等效陈述?
答案 0 :(得分:6)
conductor=root
使conductor
指向与node
相同的地址,而
conductor=malloc(sizeof(struct node));
conductor->item=root->item;
conductor->next=root->next;
创建一个全新的副本。你可以试试
printf("%p %p", conductor, root);
查看他们指向的地址,或
node->item = 12345;
printf("%d %d", conductor->item, root->item);
查看他们实际是否引用同一个实例。
答案 1 :(得分:0)
基本上,指针引用存储器中存储值的区域。指针本身是一个8字节的整数(虽然确切的大小取决于机器),它指的是内存中的一个位置。当我们有一个指向某种类型的指针时,指针的值指的是内存中该类型的第一个字节。
当您最初声明一个指针时,它在分配之前没有任何有意义的值(就像C中的所有变量一样)。但要有用,它需要知道在哪里指出。您可以要求操作系统为您指定一些内存(通过malloc),或者您可以通过为其指定内存地址来指向您已有的内容。
执行conductor=root
时,您将root
(内存地址,而不是内存本身)的值复制到conductor
。由于它们都具有值,因此它们指的是内存中的相同位置,因此它们都指向同一个位置!
此方法复制指针,而不是结构,因此它们都指向内存中的相同内容。因此,如果你在哪里重新分配root->item
,conductor->item
的值也会改变。
请注意,您现在已经为两个不同的名称提供了相同的内存位置,这可能非常方便或非常令人沮丧。这种现象称为别名(see Wikipedia)。小心使用!
当你调用malloc时,你要求操作系统留出一些固定的内存块,大到足以存储你请求的数据量。 malloc执行此操作,然后返回该块中第一个字节的内存位置(指针)。因此,当你说root = malloc(sizeof(struct node))
时,你会得到一个指针,指向一个足够大的新内存块,用于一个节点结构。
当你执行conductor = malloc(sizeof(struct node))
时,你要留出另一个新的内存块并告诉conductor
指向该块。所以在第一个例子中,他们正在寻找同一个地方,而在第二个例子中,他们正在寻找不同的地方。
此方法的作用是使conductor
指向结构root
指向的完全独立的副本。如果您重新分配root->item
的值,conductor->item
将保持不变。
请注意conductor->item
为(* conductor).item
的简写conductor
。您首先解除引用item
指针以获取存储在那里的值(导体结构),然后访问conductor->item=root->item
成员。当您执行root->item
时,您将conductor->item
的值复制到conductor
变量中,该变量位于新的内存块中,您可以使用malloc& d为conductor
。您没有更改root->next = conductor
变量本身的任何内容,只是它指向的内存。
在链接列表的上下文中,您可能希望执行next
之类的操作。这将使conductor
指向与conductor
相同的内存位置,因此您可以引用conductor
指向的值。然后next
可以有另一个指向其next
成员中引用的节点的指针,依此类推,可以根据需要添加列表中的链接。请注意,通常的做法是将最后一个链接的NULL
值设置为{{1}},以便了解结束的位置。
答案 2 :(得分:0)
它的完全指针概念..我希望没有什么可以处理Linkedlist。
conductor = node ;
上面的行是一个指针赋值。在此之后,两个指针将指向/引用相同的内存位置。
conductor = malloc(sizeof(struct node));
conductor->item = root->item;
conductor->next = root->next;
这里你要为导体分配内存。