typedef结构与*的名称在c
问题描述:
我遇到了这种奇怪的方式来定义在C中的结构,我无法找到任何地方这是真的吗?typedef结构与*的名称在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
并动态创建一个对象o f结构和指针指向这个动态创建的对象。
在第二种情况下
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
即相当于int[10]
的数组对象a
后,你可以写。
此声明
typedef int (*A)[10];
声明的名称A
作为别名的类型指针int[10]
类型的阵列。
这个声明可以用于例如以下方式
int a[10];
A ptr_a = &a;
答
当你写
typedef struct {
int val;
} Name;
你说“这个名字Name
现指struct
一个元素,一个int
名为val
“。
当你写
typedef struct {
int val;
} *Name;
明星改变了意义,使这个说“这个名字Name
现指指针为struct
一个成员,一个名为int
val
。”这就是为什么你需要使用箭头运算符而不是一个点:在第一种情况下,Name
是一种诚实善良的结构,而第二种Name
是一种指向结构的指针。
@usr,那不是同一个主题的人。 –
那不是我的问题吗? – Lurr
首先'Name'是一个指针结构的类型。避免在类型中隐藏指针 - 仅在特定情况下才是好的 – chux