
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á.
Perguntas para a lista do
Curso de C