带有 * 的 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
中是一个指向结构的类型。
我遇到过这种在 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
中是一个指向结构的类型。