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