C - Sindicatos
UMA unioné um tipo de dados especial disponível em C que permite armazenar diferentes tipos de dados no mesmo local de memória. Você pode definir uma união com muitos membros, mas apenas um membro pode conter um valor a qualquer momento. As uniões fornecem uma maneira eficiente de usar o mesmo local de memória para fins múltiplos.
Definindo uma União
Para definir um sindicato, você deve usar o uniondeclaração da mesma forma que você fez ao definir uma estrutura. A declaração de união define um novo tipo de dados com mais de um membro para seu programa. O formato da declaração sindical é o seguinte -
union [union tag] {
member definition;
member definition;
...
member definition;
} [one or more union variables];
o union tagé opcional e cada definição de membro é uma definição de variável normal, como int i; ou flutuar f; ou qualquer outra definição de variável válida. No final da definição da união, antes do ponto e vírgula final, você pode especificar uma ou mais variáveis de união, mas é opcional. Aqui está a maneira como você definiria um tipo de união denominado Data tendo três membros i, f e str -
union Data {
int i;
float f;
char str[20];
} data;
Agora, uma variável de Datatype pode armazenar um inteiro, um número de ponto flutuante ou uma string de caracteres. Isso significa que uma única variável, ou seja, a mesma localização da memória, pode ser usada para armazenar vários tipos de dados. Você pode usar qualquer tipo de dados integrado ou definido pelo usuário dentro de uma união com base em seus requisitos.
A memória ocupada por um sindicato será grande o suficiente para conter o maior membro do sindicato. Por exemplo, no exemplo acima, o tipo de dados ocupará 20 bytes de espaço de memória porque este é o espaço máximo que pode ser ocupado por uma sequência de caracteres. O exemplo a seguir exibe o tamanho total da memória ocupado pela união acima -
#include <stdio.h>
#include <string.h>
union Data {
int i;
float f;
char str[20];
};
int main( ) {
union Data data;
printf( "Memory size occupied by data : %d\n", sizeof(data));
return 0;
}
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Memory size occupied by data : 20
Acessando Sócios Sindicais
Para acessar qualquer membro de um sindicato, usamos o member access operator (.). O operador de acesso de membro é codificado como um período entre o nome da variável de união e o membro de união que desejamos acessar. Você usaria a palavra-chaveunionpara definir variáveis do tipo união. O exemplo a seguir mostra como usar sindicatos em um programa -
#include <stdio.h>
#include <string.h>
union Data {
int i;
float f;
char str[20];
};
int main( ) {
union Data data;
data.i = 10;
data.f = 220.5;
strcpy( data.str, "C Programming");
printf( "data.i : %d\n", data.i);
printf( "data.f : %f\n", data.f);
printf( "data.str : %s\n", data.str);
return 0;
}
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
data.i : 1917853763
data.f : 4122360580327794860452759994368.000000
data.str : C Programming
Aqui, podemos ver que os valores de i e f membros da união foram corrompidos porque o valor final atribuído à variável ocupou o local da memória e esta é a razão que o valor de str membro está sendo impresso muito bem.
Agora vamos olhar para o mesmo exemplo mais uma vez, onde usaremos uma variável por vez, que é o objetivo principal de ter sindicatos
#include <stdio.h>
#include <string.h>
union Data {
int i;
float f;
char str[20];
};
int main( ) {
union Data data;
data.i = 10;
printf( "data.i : %d\n", data.i);
data.f = 220.5;
printf( "data.f : %f\n", data.f);
strcpy( data.str, "C Programming");
printf( "data.str : %s\n", data.str);
return 0;
}
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
data.i : 10
data.f : 220.500000
data.str : C Programming
Aqui, todos os membros estão sendo impressos muito bem porque um membro está sendo usado por vez.