2017-09-22 9 views
0

Je suis tombé sur cette étrange façon de définir une structure en C et je ne trouve nulle part ce que c'est vraiment?structure typedef avec * au nom en c

typedef struct { 
     int val; 
    } *Name; 

Quelle est la différence?

typedef struct { 
    int val; 
} Name; 

Je vois cependant que je dois utiliser "->" sur le premier et "." sur la seconde, mais quelle est vraiment la différence?

+0

@usr, Ce n'est pas le même sujet man. –

+0

Ce n'est pas ma question? – Lurr

+1

D'abord 'Name' est un type qui est un pointeur une struct. Évitez de cacher un pointeur dans un type - seulement bon dans certaines circonstances – chux

Répondre

4

Dans le premier cas

typedef struct { 
    int val; 
} *Name; 

le nom Name est déclaré comme un alias pour le pointeur de type à une structure de nom.

Vous pouvez utiliser ce type de pointeur par exemple de la manière suivante

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

et vous pouvez écrire par exemple

ptr->val = 10; 

ou

(*ptr).val = 10; 

qui se trouve dans cette déclaration il est déclaré le pointeur ptr du type Nom et a créé dynamiquement un objet f la structure et le pointeur pointent vers cet objet créé dynamiquement.

Dans le second cas

typedef struct { 
    int val; 
} Name; 

le nom Name est déclaré comme un alias pour la structure sans nom lui-même.

Déclarer un objet de ce type, vous pouvez simplement écrire

Name name; 

puis

name.val = 10; 

ou tout simplement

Name name = { 10 }; 

et un objet du type de structure sera créée .

Ou si vous voulez allouer un objet du type de structure que vous pouvez écrire

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

Pour le rendre plus clair voici dynamiquement un autre exemples d'utilisation typedef.

typedef int A[10]; 

ce typedef déclare le nom A comme un alias pour le type de tableau int[10].

vous pouvez écrire après

A a; 

Cette déclaration déclare objet tableau a du type A qui est équivalent à int[10].

Cette déclaration

typedef int (*A)[10]; 

déclare le nom A comme un alias au pointeur de type à un tableau de type int[10].

Cette déclaration peut être utilisée par exemple de la manière suivante

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

Lorsque vous utilisez "*", je dois utiliser malloc pour l'instancier, mais sans Je peux simplement dire nom de nom; name.val = 3? Pourquoi donc? merci homme – Lurr

+0

@Lurr Voir ma mise à jour pos. –

+0

Merci, une autre question si cela ne vous dérange pas, l'argument de sizeof est * ptr, est-ce important ou est-il préférable de donner sizeof * Name? – Lurr

4

Lorsque vous écrivez

typedef struct { 
    int val; 
} Name; 

vous dites « le nom Name se réfère maintenant à un struct avec un élément, un int appelé val. "

Lorsque vous écrivez

typedef struct { 
    int val; 
} *Name; 

l'étoile change le sens pour que ce dit « le nom Name fait maintenant référence à un pointeur à un struct avec un membre, un int nommé val. » C'est pourquoi vous devez utiliser l'opérateur de flèche plutôt qu'un point: dans le premier cas, Name est un type qui est une structure honnête-à-bonté, et dans la seconde Name est un type qui est un pointeur vers une structure.