Curso de C

Estruturas


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.

Criando

Para se criar uma estrutura usa-se o comando struct. Sua forma geral é:

struct nome_do_tipo_da_estrutura
{
tipo_1 nome_1;
tipo_2 nome_2;
...
tipo_n nome_n;
} variáveis_estrutura;

O nome_do_tipo_da_estrutura é o nome para a estrutura. As variáveis_estrutura são opcionais e seriam nomes de variáveis que o usuário já estaria declarando e que seriam do tipo nome_do_tipo_da_estrutura. Vamos criar uma estrutura de endereço:

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.

Usando

Vamos agora utilizar as estruturas declaradas na seção anterior para escrever um programa que preencha uma ficha.

#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 (.).

Matrizes de estruturas

Um estrutura é como qualquer outro tipo de dado no C. Podemos, portanto, fazer matrizes de estruturas. Vamos ver como ficaria a declaração de uma matriz de 100 fichas pessoais:

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];

Atribuindo

Podemos atribuir duas estruturas que sejam do mesmo tipo. O C irá, neste caso, copiar uma estrutura na outra. Esta operação não apresenta problemas pois quando declaramos

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

Passando para funções

No exemplo apresentado no ítem usando, vimos o seguinte comando:

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.

Ponteiros

Podemos ter um ponteiro para uma estrutura. Vamos ver como poderia ser declarado um ponteiro para as estruturas de ficha que estamos usando nestas seções:

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).nome

Este formato raramente é usado. O que é comum de se fazer é acessar o elemento nome através do operador seta (->). Assim faremos:

p->nome

A declaração acima é muito mais fácil e concisa. Para acessarmos o elemento CEP dentro de endereco faríamos:

p->endereco.CEP

Fácil, não?

 


AUTO AVALIAÇÃO

Veja como você está. Escreva um programa fazendo o uso de struct's. Você deverá criar um tipo chamado ponto, contendo apenas a posição x e y (inteiros) do ponto. Declare 2 pontos, leia a posição (coordenadas x e y) de cada um e calcule a distância entre eles. Divida o programa através do uso de funções (por exemplo usando uma rotina para a leitura e uma rotina para o cálculo de distância). Apresente no final a distância entre os dois pontos.


Índice da Aula Próxima página


Curso de C do CPDEE/UFMG - 1996 - 1999