Uma estrutura agrupa várias variáveis numa só. Funciona como uma ficha pessoal que tenha nome, telefone e endereço. A ficha seria uma estrutura.
struct tipo_endereco { char rua [50]; int numero; char bairro [20]; char cidade [30]; char sigla_estado [3]; long int CEP; };Vamos agora criar uma estrutura chamada ficha com os dados pessoais de uma pessoa:
struct ficha_pessoal { char nome [50]; long int telefone; struct tipo_endereco endereco; };Vemos, pelos exemplos acima, como declarar uma estrutura e que uma estrutura pode fazer parte de outra.
#include <stdio.h> #include <string.h> struct tipo_endereco { char rua [50]; int numero; char bairro [20]; char cidade [30]; char sigla_estado [3]; long int CEP; }; struct ficha_pessoal { char nome [50]; long int telefone; struct tipo_endereco endereco; }; main (void) { struct ficha_pessoal ficha; strcpy (ficha.nome,"Luiz Osvaldo Silva"); ficha.telefone=4921234; strcpy (ficha.endereco.rua,"Rua das Flores"); ficha.endereco.numero=10; strcpy (ficha.endereco.bairro,"Cidade Velha"); strcpy (ficha.endereco.cidade,"Belo Horizonte"); strcpy (ficha.endereco.sigla_estado,"MG"); ficha.endereco.CEP=31340230; return 0; }O programa declara uma variável ficha do tipo ficha_pessoal e preenche os seus dados. O exemplo mostra como podemos acessar um elemento de uma estrutura: basta usar o ponto (.).
struct ficha_pessoal fichas [100];Poderíamos então acessar a segunda letra da sigla de estado da décima terceira ficha fazendo:
fichas[12].endereco.sigla_estado[1];
struct ficha_pessoal ficha;ficha não é um ponteiro, mas uma estrutrura. Veja as linhas abaixo:
void main()
{
struct ficha_pessoal primeira, segunda;
Le_dados(&primeira);
segunda = primeira;
Imprime_dados(segunda);
}
São declaradas duas estruturas do tipo ficha_pessoal, uma chamada primeira e outra chamada segunda. Supondo que haja declarada uma função Le_dados() que faça a leitura de uma estrutura, admitimos que após a execução da segunda linha de main(), a estrutura primeira estará preenchida com dados válidos. Os valores de primeira são copiados em segunda apenas com a expressão de atribuição:
segunda = primeira;
Todos os campos de primeira serão copiados na ficha chamada segunda. Devemos tomar cuidado com a seguinte declaração:
struct ficha_pessoal fichas [100];pois neste caso fichas é um ponteiro para a primeira ficha. Se quisermos a estrutura completa da n-ésima ficha devemos usar fichas[n-1].
strcpy (ficha.nome,"Luiz Osvaldo Silva");Neste comando um elemento de uma estrutura é passado para uma função. Este tipo de operação pode ser feita sem maiores considerações.
Podemos também passar para uma função uma estrutura inteira. Veja a seguinte função:
void PreencheFicha (struct ficha_pessoal ficha) { ... }Como vemos acima é fácil passar a estrutura como um todo para a função. Devemos observar que, como em qualquer outra função no C, a passagem da estrutura é feita por valor. Isto significa que alterações na estrutura dentro da função não terão efeito na variável fora da função. Mais uma vez podemos contornar este pormenor usando ponteiros e passando para a função um ponteiro para a estrutura.
struct ficha_pessoal *p;Os ponteiros para uma estrutura funcionam como os ponteiros para qualquer outro tipo de dados no C. Há, entretanto, um detalhe a ser considerado. Se apontarmos o ponteiro p declarado acima para uma estrutura qualquer e quisermos acessar um elemento da estrutura poderíamos fazer:
(*p).nomeEste formato raramente é usado. O que é comum de se fazer é acessar o elemento nome através do operador seta (->). Assim faremos:
p->nomeA declaração acima é muito mais fácil e concisa. Para acessarmos o elemento CEP dentro de endereco faríamos:
p->endereco.CEPFácil, não?
Veja como você está.