在C中声明结构

时间:2014-12-01 19:48:36

标签: c struct

struct node
{
   int data;
   struct node *next;
 }*head;

为什么我们有*头?这与做

有什么不同(更好?)
 typedef struct
{
  int data;
  struct node *next;
}head;

5 个答案:

答案 0 :(得分:3)

第一部分定义变量head,它是指向struct node类型的指针。它可以为NULL,表示您的链表没有元素。

第二个块只声明一个名为head的类型。它根本不是变量。并且它不会编译,因为next字段的类型struct node不存在。

你可能想要

typedef struct node {
    int data;
    struct node *next;
} node;
node *head;

此表单声明了2种类型struct nodenode(相同),并定义了变量head。我没有使用typedef来获取第一个表单,因为它更简单,而且无论如何你都不能在struct next字段中引用typedef。

答案 1 :(得分:2)

第一个版本声明了一个类型(struct node)和一个变量head,它是指向struct node的指针。所有列表都需要一个头,所以这很有帮助。

第二个声明head作为(否则未命名)struct的类型名称。它实际上不会编译,因为内部struct node *next引用了一个不存在的类型。

答案 2 :(得分:0)

在第一个示例中,您定义了struct,但也声明head变量是指向此struct的指针。

在您的第二个示例(typedef)中,您只需声明某种类型的同义词(但是 没有变数!)

答案 3 :(得分:0)

struct node
{
   int data;
   struct node *next;
 }*head;

在上面的代码中,您已将对象头声明为指针,以便访问其需要使用的元素数据 - >运算符,例如head-> data = 4;等等

你可以创建节点来追加头部指针

typedef struct
{
  int data;
  struct node *next;
}head;

在此代码中,您创建的每个节点都是头类型,如果您编写用于删除头部的链表代码而无法重新定义新头,则在删除头节点时会产生问题

在早期的代码头中,如果在更新head-&gt;之后更新其结构中的下一个元素,可以通过更新其指针来更改指针,然后我们可以轻松地删除前一个头而不会丢失新头< /强>

答案 4 :(得分:0)

the gdb debugger (and perhaps other debuggers) 
can only see the contents/format of a struct that contains a tag name.

The use of a typedef hides the tag name and defines a new type.  
however, gdb will not properly display the contents of any instance of the struct.

The correct way is:
struct tagname { ... };

Notice no struct name to clutter the symbol table and create confusion
Of course, then each defining instance of this struct needs to be written as:
struct tagname myName;
but that should not be a problem and adds the visible documentation
that myName is a struct

Along with the increased visibility of the struct, both to gdb and the reader
of the resulting code, any pointer to that struct should never be defined 
as part of the struct definition.  Such a formatting hides the
fact that such name is a pointer.  rather declare an instance of a pointer as:
struct tagname * pMyStruct;

And, never use this syntax:
struct { ... } structName; 
as that is a depreciated syntax