Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.

  1. Entender o tipo union e acessar membros
  2. Usar union como parâmetro/argumento
  3. Usar union como retorno
  4. Usar vetor/matriz de union
  5. Ponteiro para union

O básico sobre tipo de dado union foi visto em C Tipos de Dados: Union. Os assuntos vetor/matriz e funções podem ser vistos em C: Vetor e Matriz e Funções. O uso de ponteiro para union pode ser visto em Ponteiro para union.

O tipo union é um tipo de dado complexo que é composto de um ou mais membros de tipos de dados diferentes. Esses membros utilizam o mesmo espaço de memória.

A declaração de um enum e de uma variável do tipo union são feita de acordo com as sintaxes abaixo:

Sintaxe
union nome_union
{
  tipo_dado membro1;
  tipo_dado membro2;
  tipo_dado membroN;
};
union nome_union nome_variavel;

O corpo de uma union é delimitado por "{" e "}" e seus membros são separados por (;). Uma union deve ser teminada com (;) e seus membros não pode ser iniciados como structs ou enums.

O acesso aos membros de um union é feita utilizando o operadore (.) seguido do nome do do membro como pode ver visto na sintaxe abaixo:

Sintaxe
variavel_union.nome_membro
Exemplo 1
#include <stdio.h>

union uniao
{
   float valor1;
   int valor2;
};

int main ()
{
  union uniao teste;
  teste.valor1 = 10.99; // uso do membro float
  printf ("%f\n", teste.valor1); //uso do membro float
  teste.valor2 = 999; //uso do membro int
  printf ("%d\n", teste.valor2); //uso do membro
  return 0;
}
            
Saída
10.990000
999
            

Como um union agrupa vários tipos de dados em apenas um local de memória, é necessário trabalhar com um membro de union por vez, ou seja, a cada atribuição a um determinado membro, a utilização do mesmo deve ser feito em sequência.

Caso seja feita a atribuição de valores para todos os membros de uma union de forma sequencial, apenas o valor atribuído ao último membro será válido. Acessando outros membros porderá gerar dados corrompidos.

O uso de union como parâmetro de um função e a passagem como argumento é semelhante aos outros exemplos de outros tipos de dados já vistos.

Sintaxe
void nome_funcao(union nome_union nome_param)
{
  //corpo
}
            
Exemplo 2
#include 

union uniao
{
   float valor1;
   int valor2;
};

void funcao(union uniao param)
{
  //printf ("%f\n", param.valor1); 
  printf ("%d\n", param.valor2);     
}

int main ()
{
  union uniao teste;
  //teste.valor1 = 10.99; // 
  teste.valor2 = 999; //uso do membro int
  funcao(teste);
  return 0;
}
            
Saída
999
            

Os conceitos de passavem por valor e por referência também são aplicados ao uso do tipo de dado union usado como parâmetro.

O retorno do tipo de dado por uma função é feita da mesma forma utilizada como outros tipos de dados. Utilizamos a palavra reservada return seguido da uma variável do tipo union.

Sintaxe
union nome_union nome_funcao(void)
{
  //corpo omitido
   return variavel_union;
}
            
Exemplo 3
#include <stdio.h>

union uniao
{
   float valor1;
   int valor2;
};

union uniao funcao()
{
  union uniao teste;
  //teste.valor1 = 10.99; // 
  teste.valor2 = 999; //uso do membro int
  return teste;
}

int main ()
{
  union uniao teste = funcao();
  printf("%d",teste.valor2);
  return 0;
}
            
Saída
999
            

O uso do tipo union como matrizes ou vetores é feito da mesma forma que outros tipos de dados. Definimos suas dimensões utilizando []. O acesso aos seus elementos é utilizando seus índices ou linha e colunas.

Sintaxe
union nome_union vetor[dimensao] = {valores};
union nome_union vetor[dimensao];
union nome_union matriz[linhas][colunas] = {valores};
union nome_union vetor[linhas][colunas];
Exemplo 4
#include <stdio.h>

union uniao
{
   float valor1;
   int valor2;
};

int main()
{
    union uniao var1;
    union uniao var2;
    
    var1.valor2 = 1;
    var2.valor2 = 2;
    
    union uniao vetor[2];
    vetor[0] = var1;
    vetor[1] = var2;
}
            
  1. 07/10/2024 - revisão 2 - Ajustes pontuais
  2. 29/09/2023 - revisão 1 - Correção em referências, erros gramaticais, sintaxe e remoção de texto lixo
  3. 19/05/2023 - versão inicial

© 2024, 2025 - TUTORIALDEV - Todos os direitos reservados - Twitter/X - Discord - Github