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

  1. Declarar, acessar e alterar valores de uma union
  2. Union como parâmetro/argumento
  3. Union como retorno
  4. Vetor/matriz de union
  5. Union com reference como membro
  6. comparando unions
  7. ponteiro para union
  8. cast e conversão

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 tanto para escrita quanto para acesso que devem ser feitos de forma sequencial.

A declaração é feita da seguinte forma:

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 terminada com (;) e seus membros não pode ser iniciados como em 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;

variavel_union.nome_membro = valor;
Exemplo 1
#include <iostream>
using namespace std;

union uniao
{
   float valor1;
   int valor2;
};

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

Como um union agrupa vários tipos de dados em apenas um local de memória, é necessário trabalhar com um membro por vez.

Caso seja feita a atribuição de valores nos membros de uma union de forma sequencial, apenas o valor atribuído ao último membro será válido. Acessando outros membros, há a possibilidade de geração dados corrompidos dependendo dos tipos de dados usados.

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

Sintaxe
tipo_retorno nome_funcao(union nome_union nome_param)
{
  //corpo
}
Exemplo 2
#include <iostream>
using namespace std;

union uniao
{
   float valor1;
   int valor2;
};

void funcao(union uniao un)
{
    cout << un.valor1;
}

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

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

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 enum.

Sintaxe
enum tipo_union nome_funcao(<lista_parametros>)
{
  //corpo omitido
   return variavel_tipo_union;
}
            
Exemplo 3
#include <iostream>
using namespace std;

union uniao
{
   float valor1;
   int valor2;
};

union uniao funcao(void)
{
  union uniao teste;
  teste.valor1 = 10.99; // uso do membro float
  return teste;
  
}

int main ()
{
  union uniao teste = funcao();
  cout << teste.valor1;
  return 0;
}
Saída
10.99

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

Sintaxe: vetor
union nome_union vetor[num_elem] = {valores}; //iniciado
union nome_union vetor[indice]; //reservado
Sintaxe: matriz
union nome_union matriz[linhas][colunas] = {valores};
union nome_union matriz[linhas][colunas];
Exemplo 4
#include <iostream>

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;
}
Saída
-
  1. 29/07/2025 - revisão 3 - Correções pontuais e ajustes em sintaxes
  2. 30/09/2024 - revisão 2 - Ajustes gramaticais pontuais e outros
  3. 09/02/2024 - revisão 1 - correção em navegação, exemplos e erros gramaticais
  4. 30/06/2023 - versão inicial