Vous pouvez utiliser n'importe quel type de données dans une union, il n'y a pas de restriction.
Quant à l'utilisation des syndicats sur des structures, des structures de disposer de leurs données de manière séquentielle dans la mémoire. Cela signifie que tous leurs sous-composants sont séparés.
Les syndicats, d'autre part, l'utilisation de la mémoire pour l'ensemble de leurs sous-composantes, de sorte que l'on peut exister à la fois.
Par exemple:
+-----+-----+struct{int a;float b } gives | a | b |+-----+-----+^^||
memory location:150154|
V
+-----+union{int a;float b } gives | a || b |+-----+
Structures sont utilisées là où un "objet" est composé d'autres objets, comme un point objet composé de deux entiers, ceux-ci étant les coordonnées x et y:
typedefstruct{int x;//x and y are separateint y;} tPoint;
Les syndicats sont généralement utilisés dans des situations où un objet peut être l'un des beaucoup de choses, mais un seul à la fois, comme un sans-type de système de stockage:
typedefenum{ STR, INT } tType;typedefstruct{
tType typ;//typ is separate.union{int ival;//ival and sval occupy same memory.char*sval;}} tVal;
Ils sont utiles pour économiser de la mémoire même si cela tend à être de moins en moins une préoccupation de nos jours (autres que dans les bas-niveau de travail comme les systèmes embarqués) de sorte que vous ne voyez pas beaucoup de lui.
4
Bien, selon la norme ISO/IEC 9899:TC3 (le standard C99):
Un type d'union décrit un chevauchement ensemble non vide d'états des objets, chacun de
qui a éventuellement nom spécifié et, éventuellement, type distinct.
En bref, l'espace de la mémoire des membres de l'union des chevauchements, et les noms que vous donnez aux membres du syndicat de permettre la lecture de la mémoire à l'emplacement de la taille. Considérer:
Dans le premier printf, ce que nous faisons, c'est l'impression de 8 bits parties de l'entier de 32 bits. En espérant bien sûr pour pas de rembourrage en anonyme struct.
Dans la deuxième printf? J'ai dû marcher à travers l'utilisation de gdb pour comprendre, mais je l'ai fait:
Bien sûr, les pointeurs sont toutes de la même taille, de sorte que l'attribution p.q remplace l'adresse de p.p. Je soupçonne fortement que de référencement de l'adresse de l'entier de 32 bits à 8 bits pointeur est l'impression de "tout ce qui est à cet emplacement + 32 bits" qui co-soit dit en passant, pour moi, se trouve être 22334411. Mais je soupçonne que, à ce stade, le comportement est indéfini.
De toute façon, le point de ce petit exercice est de vous montrer que:
les syndicats peuvent être utilisés pour accéder au même emplacement de mémoire à travers un autre "type" de modificateur.
Vous devez faire attention à ce que vous faites et de comprendre le type sous-jacent que vous utilisez. Si vous allez utiliser des pointeurs, méfiez-vous de leur modification que vous pouvez commencer pointage de qui sait quoi.
Je tiens à souligner que j'pouvez voir l'utilisation pratique pour somenewtype mais pas pour somepointer - qui a été un exemple artificiel, j'étais pratiquement sûr de se briser.
Vous pouvez utiliser n'importe quel type de données dans une union, il n'y a pas de restriction.
Quant à l'utilisation des syndicats sur des structures, des structures de disposer de leurs données de manière séquentielle dans la mémoire. Cela signifie que tous leurs sous-composants sont séparés.
Les syndicats, d'autre part, l'utilisation de la mémoire pour l'ensemble de leurs sous-composantes, de sorte que l'on peut exister à la fois.
Par exemple:
Structures sont utilisées là où un "objet" est composé d'autres objets, comme un point objet composé de deux entiers, ceux-ci étant les coordonnées x et y:
Les syndicats sont généralement utilisés dans des situations où un objet peut être l'un des beaucoup de choses, mais un seul à la fois, comme un sans-type de système de stockage:
Ils sont utiles pour économiser de la mémoire même si cela tend à être de moins en moins une préoccupation de nos jours (autres que dans les bas-niveau de travail comme les systèmes embarqués) de sorte que vous ne voyez pas beaucoup de lui.
Bien, selon la norme ISO/IEC 9899:TC3 (le standard C99):
En bref, l'espace de la mémoire des membres de l'union des chevauchements, et les noms que vous donnez aux membres du syndicat de permettre la lecture de la mémoire à l'emplacement de la taille. Considérer:
Dans le premier printf, ce que nous faisons, c'est l'impression de 8 bits parties de l'entier de 32 bits. En espérant bien sûr pour pas de rembourrage en anonyme struct.
Dans la deuxième printf? J'ai dû marcher à travers l'utilisation de gdb pour comprendre, mais je l'ai fait:
Bien sûr, les pointeurs sont toutes de la même taille, de sorte que l'attribution
p.q
remplace l'adresse dep.p
. Je soupçonne fortement que de référencement de l'adresse de l'entier de 32 bits à 8 bits pointeur est l'impression de "tout ce qui est à cet emplacement + 32 bits" qui co-soit dit en passant, pour moi, se trouve être22334411
. Mais je soupçonne que, à ce stade, le comportement est indéfini.De toute façon, le point de ce petit exercice est de vous montrer que:
Je tiens à souligner que j'pouvez voir l'utilisation pratique pour
somenewtype
mais pas poursomepointer
- qui a été un exemple artificiel, j'étais pratiquement sûr de se briser.