这些c结构声明之间的区别



我有一个像这样的代码:

struct point {
   int a;
   int b;
}

可以进一步这样使用:

struct point p;
p.x = 10;
p.y = 5;

现在我知道这也可以这样写:

typedef struct{
   int x;
   int y;
} point;

,可用作point p

当我开始学习链表时,混乱开始了,这是我看到的代码。

typedef struct node {
    int val;
    struct node * next;
} node_t;

我有几个问题:

    如果我们可以用typedef struct { ... } node来定义结构体,那么写typedef struct node {.....又有什么用呢
  1. 代码末尾的node_t确实令人困惑,因为从我的理解它已经定义了一个类型node,所以我们可以调用node x来创建一个节点,那么node_t的需要是什么,或者基本上在}之后写任何东西,这意味着什么?

不应该这样做吗?

typedef struct {
        int val;
        struct node * next;
    } node;
  1. 如果我们可以简单地用typedef struct { ... } node来定义结构体,那么写typedef struct node {.....又有什么用呢

  2. 代码末尾的node_t确实令人困惑,因为从我的理解它已经定义了一个类型node,所以我们可以调用node x来创建一个节点,那么node_t的需要是什么,或者基本上在}之后写任何东西,这意味着什么?

在C语言中,结构体可以同时具有标记和typedef名称。在结构声明中:

typedef struct node {
    int val;
    struct node * next;
} node_t;   

node为标签,node_ttypedef name。之后,您可以使用标记或typedef名称来声明您的结构变量。

struct node *new_node;   // OK  
node_t *head;            // OK    

实际上,标签和typedef名称甚至可以相同,尽管这不是必需的:

typedef struct node {
    int val;
    struct node * next;
} node;  

不应该这样做吗?

typedef struct {
    int val;
    struct node * next;
} node;  

。这行不通。为什么?
原因是,当一个结构有一个成员指向与node相同的结构时,我们需要使用结构标签。如果没有node标记,我们将无法声明next的类型。


建议阅读:作为Op要求良好的数据结构资源。

  1. 教程:介绍数据结构。
  2. 图书:经典数据结构。

第三块代码,您似乎对它有疑问,它有一个冗余标识符。

typedef struct node {
    int val;
    struct node * next;
} node_t;

等于

struct node{
    int val;
    struct node * next;
};
typedef struct node node_t;

它们是相同的,但是合并到同一行。typedef的语法是

typedef [original name] [new name];

通常,当我们定义一个结构时,之后引用它的唯一方法是定义了类型的名称(在第一个代码示例中,您只能通过node_t访问它),而稍微冗余的声明也允许通过"struct node"变量类型访问。

回答你的另一个问题,node_t让你困惑的是你可以把结构体称为…例如

node_t node1;
struct node node2;

是节点结构的两个有效声明。

在这里,您也可以通过使用'struct p typedef p;'对'struct p'进行类型定义来使用'struct p'。当定义一个复杂的函数指针时,有时会让我感到困惑。我不知道为什么C语言支持这样的语法糖

我的解释如下。

struct
{
   int i;
};

声明了一个未命名的结构,显然它并没有真正的用途。如果我说错了,请纠正我。

struct
{
   int i;
} T;

现在T是给定范围内的对象,类型未命名。

struct TT
{
   int i;
} T;

声明了一个结构体TT和一个对象t。您可以使用TT来创建更多的对象。考虑这个问题的最好方法是,将struct TT{int i}视为单一类型,例如double。

typedef struct TT
{
   int i;
};

的含义与(至少在现在的编译器中)相同。我不确定那些旧的)

struct TT
{
   int i;
};

typedef struct
{
   int i;
} TT;

为给定结构声明类型TT(不是对象),因为您正在使用typedef int int;

希望这解决了混乱。

相关内容

  • 没有找到相关文章

最新更新