带有 * 的 typedef 结构到 c 中的名称

typedef structure with * to the name in c

我遇到过这种在 C 中定义结构的奇怪方法,但我在任何地方都找不到它到底是什么?

    typedef struct {
        int val;
    } *Name;

这有什么区别?

typedef struct {
   int val;
} Name;

但是我看到我必须在第一个和“.”上使用“->”。第二,但真正的区别是什么?

第一种情况

typedef struct {
    int val;
} *Name;

名称 Name 被声明为指向未命名结构的类型指针的别名。

您可以通过以下方式使用此指针类型,例如

Name ptr = malloc( sizeof( *ptr ) );

然后你可以这样写

ptr->val = 10;

( *ptr ).val = 10;

即在此声明中声明了 Name 类型的指针 ptr 并动态创建了一个结构对象,指针指向此动态创建的对象。

第二种情况

typedef struct {
    int val;
} Name;

名称 Name 被声明为未命名结构本身的别名。

要声明这种类型的对象,您只需编写

Name name;

然后

name.val = 10;

或者只是

Name name = { 10 };

并且将创建结构类型的对象。

或者如果你想动态分配一个结构类型的对象你可以这样写

Name *ptr = malloc( sizeof( Name ) );

为了更清楚地说明这里是使用 typedef 的另一个例子。

typedef int A[10];

此 typedef 将名称 A 声明为数组类型 int[10] 的别名。

之后可以写

A a;

此声明声明类型为 A 的数组对象 a 等同于 int[10].

这个声明

typedef int ( *A )[10];

将名称 A 声明为指向类型 int[10] 数组的类型指针的别名。

此声明可用于例如以下方式

int a[10];
A ptr_a = &a;

写的时候

typedef struct {
   int val;
} Name;

你说的是"the name Name now refers to a struct with one element, an int named val."

写的时候

typedef struct {
   int val;
} *Name;

星号改变了意思,所以这表示 "the name Name now refers to a pointer to a struct with one member, an int named val." 这就是为什么你需要使用箭头运算符而不是点:在第一种情况下,Name 是一个诚实的类型-to-goodness 结构,在第二个 Name 中是一个指向结构的类型。