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); }