[结构指针a =结构指针b]有什么作用?

时间:2014-08-26 02:54:29

标签: c pointers struct

我最近才把自己暴露给链接列表,我很无望。 所以无论如何,我已经给出了下面的代码片段,以便让自己更好地理解。

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;的等效陈述?

3 个答案:

答案 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->itemconductor->item的值也会改变

请注意,您现在已经为两个不同的名称提供了相同的内存位置,这可能非常方便或非常令人沮丧。这种现象称为别名(see Wikipedia)。小心使用!

的malloc

当你调用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;

这里你要为导体分配内存。