logo

União em C

União pode ser definido como um tipo de dados definido pelo usuário que é uma coleção de diferentes variáveis ​​de diferentes tipos de dados no mesmo local de memória. A união também pode ser definida como muitos membros, mas apenas um membro pode conter um valor em um determinado momento.

Union é um tipo de dados definido pelo usuário, mas diferentemente das estruturas, eles compartilham o mesmo local de memória.

Vamos entender isso através de um exemplo.

 struct abc { int a; char b; } 

O código acima é a estrutura definida pelo usuário que consiste em dois membros, ou seja, 'a' do tipo interno e 'b' do tipo personagem . Quando verificamos os endereços de 'a' e 'b', descobrimos que seus endereços são diferentes. Portanto, concluímos que os membros da estrutura não compartilham o mesmo local de memória.

Quando definimos a união, descobrimos que união é definida da mesma forma que a estrutura é definida, mas a diferença é que a palavra-chave union é usada para definir o tipo de dados da união, enquanto a palavra-chave struct é usada para definir a estrutura. A união contém os membros dos dados, ou seja, 'a' e 'b', quando verificamos os endereços de ambas as variáveis ​​descobrimos que ambas possuem os mesmos endereços. Isso significa que os membros do sindicato compartilham o mesmo local de memória.

computador inventou em que ano

Vamos dar uma olhada na representação pictórica da alocação de memória.

A figura abaixo mostra a representação pictórica da estrutura. A estrutura possui dois membros; ou seja, um é do tipo inteiro e o outro é do tipo caractere. Visto que 1 bloco é igual a 1 byte; portanto, a variável 'a' receberá 4 blocos de memória, enquanto a variável 'b' receberá 1 bloco de memória.

A figura abaixo mostra a representação pictórica dos sindicalizados. Ambas as variáveis ​​​​compartilham o mesmo local de memória e possuem o mesmo endereço inicial.

tutoriais java

Na união, os membros compartilharão o local da memória. Se tentarmos fazer alterações em qualquer membro, isso também será refletido no outro membro. Vamos entender esse conceito através de um exemplo.

 union abc { int a; char b; }var; int main() { var.a = 66; printf('
 a = %d', var.a); printf('
 b = %d', var.b); } 

No código acima, union tem dois membros, ou seja, 'a' e 'b'. O 'var' é uma variável do tipo union abc. No principal() método, atribuímos 66 à variável 'a', então var.a imprimirá 66 na tela. Como 'a' e 'b' compartilham a localização da memória, var.b irá imprimir ' B '(código ascii de 66).

Decidindo o tamanho do sindicato

O tamanho do sindicato é baseado no tamanho do maior membro do sindicato.

Vamos entender através de um exemplo.

 union abc{ int a; char b; float c; double d; }; int main() { printf('Size of union abc is %d', sizeof(union abc)); return 0; } 

Como sabemos, o tamanho de int é 4 bytes, o tamanho de char é 1 byte, o tamanho de float é 4 bytes e o tamanho de double é 8 bytes. Como a variável double ocupa a maior memória entre todas as quatro variáveis, um total de 8 bytes serão alocados na memória. Portanto, a saída do programa acima seria de 8 bytes.

Acessando membros do sindicato usando ponteiros

Podemos acessar os membros da união através de ponteiros usando o operador de seta (->).

Vamos entender através de um exemplo.

a classe abstrata pode ter construtor
 #include union abc { int a; char b; }; int main() { union abc *ptr; // pointer variable declaration union abc var; var.a= 90; ptr = &var; printf('The value of a is : %d', ptr->a); return 0; } 

No código acima, criamos uma variável ponteiro, ou seja, *ptr, que armazena o endereço da variável var. Agora, ptr pode acessar a variável 'a' usando o operador (->). Portanto, a saída do código acima seria 90.

Por que precisamos de sindicatos C?

Considere um exemplo para entender a necessidade de sindicatos C. Vamos considerar uma loja que possui dois itens:

  • Livros
  • Camisas

Os lojistas desejam armazenar os registros dos dois itens mencionados acima junto com as informações relevantes. Por exemplo, os livros incluem título, autor, número de páginas, preço e camisas incluem cor, design, tamanho e preço. A propriedade 'preço' é comum em ambos os itens. O dono da loja deseja armazenar as propriedades e depois como irá armazenar os registros.

Inicialmente, decidiram armazenar os registros em uma estrutura conforme abaixo:

 struct store { double price; char *title; char *author; int number_pages; int color; int size; char *design; }; 

A estrutura acima consiste em todos os itens que o lojista deseja armazenar. A estrutura acima é totalmente utilizável, mas o preço é comum em ambos os itens e os demais itens são individuais. As propriedades como preço, *título, *autor e número_páginas pertencem a Livros, enquanto cor, tamanho e *design pertencem a Camisa.

Vamos ver como podemos acessar os membros da estrutura .

 int main() { struct store book; book.title = 'C programming'; book.author = 'Paulo Cohelo'; book.number_pages = 190; book.price = 205; printf('Size is : %ld bytes', sizeof(book)); return 0; } 

No código acima, criamos uma variável do tipo loja . Atribuímos os valores às variáveis ​​título, autor, número_páginas, preço, mas a variável livro não possui propriedades como tamanho, cor e design. Portanto, é um desperdício de memória. O tamanho da estrutura acima seria de 44 bytes.

Podemos economizar muito espaço se usarmos sindicatos.

 #include struct store { double price; union { struct{ char *title; char *author; int number_pages; } book; struct { int color; int size; char *design; } shirt; }item; }; int main() { struct store s; s.item.book.title = 'C programming'; s.item.book.author = 'John'; s.item.book.number_pages = 189; printf('Size is %ld', sizeof(s)); return 0; } 

No código acima, criamos uma variável do tipo store. Como utilizamos as uniões no código acima, a maior memória ocupada pela variável seria considerada para a alocação de memória. A saída do programa acima é de 32 bytes. No caso das estruturas obtivemos 44 bytes, enquanto no caso das uniões o tamanho obtido é de 44 bytes. Conseqüentemente, 44 bytes é maior que 32 bytes, economizando muito espaço de memória.

linux renomear pasta