next up previous contents
Next: Ponteiros para funções Up: Ponteiros Previous: Ponteiro como argumento de   Sumário


Ponteiros e estruturas

Uma vez que variáveis do tipo estrutura são tratadas exatamente da mesma forma que variáveis de tipos básicos, é possível definir variáveis do tipo ponteiro para estruturas, como em

    struct dados_pessoais *pa;

Componentes de uma estrutura podem ser ponteiros para outros tipos de dados ou estruturas. Em algumas situações, pode haver a necessidade de ter como um dos componentes da estrutura um ponteiro para um tipo da própria estrutura. Um exemplo típico é a construção de listas ligadas, compostas por nós onde um dos dados armazenados em cada nó é um ponteiro para o próximo nó. Esta situação seria representada como

    struct no_lista {
        /* conteudo do no: */
        ...
        /* ponteiro ao proximo no: */
        struct no_lista *proximo;
    };

Uma forma básica de acesso aos membros de uma estrutura (através do operador .) já foi descrita neste capítulo. A outra forma de acesso a membros de estruturas facilita a notação quando ponteiros para estruturas estão envolvidos. Para ilustrar esta forma, suponha que uma função que lê os dados de um aluno no programa acima retorna na verdade um ponteiro para uma estrutura do tipo dados_pessoais. Por exemplo,

    struct dados_pessoais *le_aluno();   /* prototipo */
    struct dados_pessoais *aluno_pt;     /* ponteiro */

    aluno_pt = le_aluno();

O acesso a membros da variável aluno_pt poderia ser feito da forma usual, ou seja, *aluno_pt é uma estrutura, então seria possível acessar seus membros como em

    printf("%s nasceu em %2d/%2d/%4d\n",
           (*aluno_pt).nome,
           (*aluno_pt).nascimento.dia,
           (*aluno_pt).nascimento.mes,
           (*aluno_pt).nascimento.ano);

A notação simplificada utiliza o ponteiro -> (seta) para substituir uma construção na forma (*A).M por A->M. O exemplo original poderia ser reapresentado integrando estes últimos aspectos como

    int main() {
        struct data hoje;
        struct dados_pessoais *aluno_pt;
        int idade;
        /* prototipos: */
        int calc_idade(struct dados_pessoais, struct data);
        struct data le_hoje();
        struct dados_pessoais *le_aluno();

        /* obtem dados para hoje e aluno */
        hoje = le_hoje();
        aluno_pt = le_aluno();

        idade = calc_idade(*aluno_pt, hoje);

        /* apresenta resultado */
        printf("Idade de %s: %d\n",
               aluno_pt->nome,
               idade);

        return(0);
    }


next up previous contents
Next: Ponteiros para funções Up: Ponteiros Previous: Ponteiro como argumento de   Sumário
Ivan L. M. Ricarte 2003-02-14