J'ai lu un tutoriel dans lequel il y a cette structure:
struct EmployeeType { char Name[25]; int Age; float SkillRating; };
définit un nouvel agrégat, appelé Employee, contenant des champs appelés Name (de type caractère), Age (de type integer) et SkillRating (de type float).
En revanche, l'instruction C:
struct { char Name[25]; int Age; float SkillRating; } Employee;
ne définit pas de nouvelle variable d'agrégation, mais définit un nouveau type d'agrégat, Type d'employé. Ce nouveau type de données pourrait ensuite être utilisé pour déclarer des variables dans le de la même manière qu'un type de données primitif. Autrement dit, de la même manière que C permet le variable x à déclarer comme un entier à l'aide de l'instruction
Je suis confus ici. La distinction existe-t-elle si vous placez «Employé» sur une position différente?
Je suppose qu'ils sont identiques.
3 Réponses :
int func(int a, struct A_s { int memb; } b); struct A_s { int memb; } func(int a); struct B_s { int memb1; struct A_s { int memb2; } a; };
Dans le premier cas, la struct
est sans nom et Employee
est une variable de cette structure sans nom. Vous pouvez le modifier directement comme ceci:
int main() { Employee.Age = 100; struct EmployeeType a; // employee on the stack a.Age = 100; return 0; }
Dans le second cas, EmployeeType
n'est qu'un type, mais vous n'en avez pas encore créé d'instance. Vous pouvez créer n'importe quel nombre d'instances:
struct EmployeeType { char Name[25]; int Age; float SkillRating; } Employee;
Vous pouvez même faire les deux à la fois:
int main() { struct EmployeeType a; // employee on the stack a.Age = 100; struct EmployeeType *b = malloc(sizeof(struct EmployeeType)); // employee on the heap if (b) { // set the age of b if the allocation succeeded b->Age = 100; } free(b); // malloc-allocated memory must be freed afterwards return 0; }
Ici, Employee
en est une instance, mais vous pouvez créer des instances supplémentaires:
int main() { Employee.Age = 100; return 0; }
Le mot clé struct
en C peut être utilisé pour déclarer des types de données agrégés, des objets de données agrégés ou les deux.
Dans votre première déclaration (et définition), un nom de balise est manquant, donc un objet anonyme «Employé» est créé. «Employee» reste le seul objet de cette structure. Vous ne pouvez pas créer plus d'objets à partir de cette structure ailleurs dans le code.
Dans votre deuxième déclaration, vous avez créé un type de structure qui peut être instancié plusieurs fois (c'est-à-dire que plusieurs instances de cette structure peuvent exister) comme ci-dessous -
struct EmployeeType employee_1; struct EmployeeType employee_2;
Ces deux syntaxes sont utiles en fonction du cas d'utilisation.
"La distinction existe-t-elle si l'on place« l'employé »à un poste différent?" Oui. Et vous pouvez également placer à la fois EmployeeType et Employee dans une seule instruction qui combinera simplement les deux significations.
La syntaxe
struct
est encore un autre échec du langage en C. Elle est tout simplement incohérente et s'ouvre à différents styles. Je vous conseillerais de faire ceci: si vous avez besoin d'un type struct, utiliseztypedef struct {...} type;
Si vous avez besoin d'une variable struct, utiliseztype name;
. Dans les rares cas où vous avez besoin d'une structure auto-référencée (comme un nœud de liste chaînée), faites ceci:typedef struct tag {... struct tag * next; } type;
. Et c'est tout.@Alice. J'ai eu le même problème dans le passé et le pire reste à venir lorsque typedef sera utilisé avec struct. Vous verrez une syntaxe comme
typedef struct X {...} X; ou typedef struct {...} X, typedef struct X X, ...
. Je vous suggère donc de lire ces articles stackoverflow.com/q/1675351/7462275 et stackoverflow.com/q/252780/7462275