typedef结构与*的名称在c

问题描述:

我遇到了这种奇怪的方式来定义在C中的结构,我无法找到任何地方这是真的吗?typedef结构与*的名称在c

typedef struct { 
     int val; 
    } *Name; 

这是什么区别?

typedef struct { 
    int val; 
} Name; 

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

+0

@usr,那不是同一个主题的人。 –

+0

那不是我的问题吗? – Lurr

+1

首先'Name'是一个指针结构的类型。避免在类型中隐藏指针 - 仅在特定情况下才是好的 – chux

在第一种情况

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; 
+0

使用“*”时,我必须使用malloc来实例化它,但没有我可以简单地说名字的名字; name.val = 3?这是为什么?谢谢你 – Lurr

+0

@Lurr看到我更新的位置。 –

+0

谢谢,另一个问题,如果你不介意,sizeof的参数是* ptr,它是否重要,或者它比给予sizeof * Name更可取? – Lurr

当你写

typedef struct { 
    int val; 
} Name; 

你说“这个名字Name现指struct一个元素,一个int名为val“。

当你写

typedef struct { 
    int val; 
} *Name; 

明星改变了意义,使这个说“这个名字Name现指指针struct一个成员,一个名为intval。”这就是为什么你需要使用箭头运算符而不是一个点:在第一种情况下,Name是一种诚实善良的结构,而第二种Name是一种指向结构的指针。