Neste tutorial, você aprenderá sobre uniões em programação C. Mais especificamente, como criar sindicatos, acessar seus membros e aprender as diferenças entre sindicatos e estruturas.
Uma união é um tipo definido pelo usuário semelhante a structs em C, exceto por uma diferença fundamental. As estruturas alocam espaço suficiente para armazenar todos os seus membros, enquanto os sindicatos alocam o espaço para armazenar apenas o maior membro.
Como definir um sindicato?
Usamos a union
palavra-chave para definir sindicatos. Aqui está um exemplo:
union car ( char name(50); int price; );
O código acima define um tipo derivado union car
.
Crie variáveis de união
Quando uma união é definida, ela cria um tipo definido pelo usuário. No entanto, nenhuma memória é alocada. Para alocar memória para um determinado tipo de união e trabalhar com ele, precisamos criar variáveis.
Veja como criamos variáveis de união.
union car ( char name(50); int price; ); int main() ( union car car1, car2, *car3; return 0; )
Outra forma de criar variáveis de união é:
union car ( char name(50); int price; ) car1, car2, *car3;
Em ambos os casos, as variáveis de união car1, car2 e um ponteiro de união car3 do union car
tipo são criados.
Acessar membros de um sindicato
Usamos a .
operadora para acessar membros de um sindicato. Para acessar variáveis de ponteiro, usamos também use o ->
operador.
No exemplo acima,
- Para acessar o preço de
car1
,car1.price
é usado. - Para acessar o preço usando
car3
,(*car3).price
oucar3->price
pode ser usado.
Diferença entre sindicatos e estruturas
Vamos dar um exemplo para demonstrar a diferença entre sindicatos e estruturas:
#include union unionJob ( //defining a union char name(32); float salary; int workerNo; ) uJob; struct structJob ( char name(32); float salary; int workerNo; ) sJob; int main() ( printf("size of union = %d bytes", sizeof(uJob)); printf("size of structure = %d bytes", sizeof(sJob)); return 0; )
Resultado
tamanho da união = 32 tamanho da estrutura = 40
Por que essa diferença no tamanho das variáveis de união e estrutura?
Aqui, o tamanho de sJob é de 40 bytes porque
- o tamanho
name(32)
é de 32 bytes - o tamanho
salary
é de 4 bytes - o tamanho
workerNo
é de 4 bytes
No entanto, o tamanho de uJob é de 32 bytes. É porque o tamanho de uma variável de união sempre será o tamanho de seu maior elemento. No exemplo acima, o tamanho de seu maior elemento, ( name(32)
), é de 32 bytes.
Com um sindicato, todos os membros compartilham a mesma memória .
Exemplo: acessando membros do sindicato
#include union Job ( float salary; int workerNo; ) j; int main() ( j.salary = 12.3; // when j.workerNo is assigned a value, // j.salary will no longer hold 12.3 j.workerNo = 100; printf("Salary = %.1f", j.salary); printf("Number of workers = %d", j.workerNo); return 0; )
Resultado
Salário = 0,0 Número de trabalhadores = 100
Para saber onde os sindicatos são usados, visite Por que precisamos dos sindicatos C?