Ponteiro em C: Estruturas

funções X macros compilação condicional Diagnóstico

Neste artigo serão discutidos alguns tópicos sobre ponteiros e estruturas. Na linguagem C, uma estrutura é uma coleção de variáveis referenciada por um nome, também chamada de tipo de dado agregado. Utilizando ponteiros para estruturas a forma como os membros são referenciados é alterada, sendo esse tópico importante para entender a passagem de estruturas para funções.

Declaração de Ponteiros para Estruturas

Um ponteiro para estrutura pode ser declarado da forma mostrada abaixo.

struct <tipo> * <nome do ponteiro>;

Cabe observar que a declaração do ponteiro para estruturas é exatamente igual à declaração de ponteiros para outros tipos de variáveis. Para evitar erros de compilação do tipo da estrutura deve ser previamente definido. Considere o exemplo abaixo.

A declaração de um ponteiro para estrutura NumeroComplexo é mostrada abaixo. Essa forma de declaração será equivalente para ponteiros de estruturas que são declarados como parâmetros de funções.

Para inicializar o ponteiro com um endereço válido é necessário utilizar o operador ‘&’ antes de uma estrutura. O código abaixo mostra a declaração de uma estrutura e a inicialização do ponteiro.

Referenciando Elementos da Estrutura

Para acessar os membros da estrutura o operador seta ‘->’ deve ser utilizado. Esse operador é utilizado no lugar do operador ponto e determina que o acesso ao membro será realizado por um ponteiro [1]. Abaixo é mostrado o acesso ao membro Real que foi definido na estrutura NumeroComplexo.

Ao utilizar o operador seta estamos acessando o conteúdo do membro da estrutura, no entanto é possível obter o endereço individual de cada variável declarada na estrutura. Neste caso, o operador ‘&’ deve ser utilizado antes do nome da estrutura. O código abaixo mostra como obter o endereço de um membro a partir da estrutura ou de um ponteiro para estrutura.

A Figura 1 ilustra essas operações. Note que acessar o membro e depois obter o endereço é o mesmo que obter o endereço diretamente da estrutura.

Estruturas: Memória
Figura 1: Ponteiro para estrutura.

Obter o endereço de um membro específico pode ser interessante em algumas situações, por exemplo, passar apenas alguns valores de uma estrutura para uma determinada função. Considere o exemplo abaixo no qual um ponteiro para float é utilizado para acessar o membro Imaginario da estrutura NumeroComplexo.

Essa situação é ilustrada na Figura 2.

Estruturas: Memória
Figura 2: Ponteiro do tipo de um membro da estrutura.

Passando Estruturas para Funções

Uma das vantagens de poder criar um ponteiro para função se dá pelo fato de utilizar um ponteiro como parâmetro de função, isto é, uma estrutura pode ser passada por referência para uma determinada função. Isso pode ser considerado um ganho de desempenho, pois ao passar uma estrutura por referência estaremos apenas manipulando o seu endereço, evitando que todos os seus membros sejam passados por valor. No exemplo abaixo foi criada uma função para somar dois números complexos, para isso a função recebe três estruturas por referência.

Lembrando que o acesso deve ser realizado pelo operador seta.

A chamada da função é mostrada abaixo.

Note que apenas os endereços das estruturas são passados para a função. Para evitar que os parâmetros sejam alterados, o modificador const pode ser utilizado.

O modificador const após o operador ‘*’ determina que o endereço que o ponteiro armazena não pode ser alterado, já o modificador antes do operador ‘*’ garante que o conteúdo deste endereço não pode ser alterado. Deste modo, somente o ponteiro resultado pode alterar o conteúdo do endereço apontado.

Conclusão

Os tópicos discutidos neste artigo são de grande importância para trabalhar com estruturas de dados. Como demonstrado, os ponteiros também podem ser utilizados para acessar os membros de uma estrutura, no entanto o mesmo pode ser realizado por ponteiros do tipo do membro uma vez que é possível obter seu endereço. Essa característica permite que a estruturas sejam passadas por referência na chamada de funções, evitando que todos os membros da estrutura sejam passados por valor. Isso também possibilita que os membros reais sejam alterados na estrutura usada na chamada da função.

Referências

[1] – Livro: C, completo e total – 3ª edição revista e atualizada. Herbert Schildt.

Fonte da imagem destacada: http://listamaze.com/top-10-programming-languages-for-job-security/

Outros artigos da série

<< Ponteiro em C: FunçõesPonteiro em C: Alocação Dinâmica de Memória >>
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Software » Ponteiro em C: Estruturas
Comentários:
Notificações
Notificar
guest
4 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Gustavo Massaneiro
Gustavo Massaneiro
10/01/2016 18:54

Muito Bom!

Fernando Deluno Garcia
Fernando Deluno Garcia
Reply to  Gustavo Massaneiro
11/01/2016 08:56

Obrigado, Gustavo.

Igor Borges Tavares
Igor Borges
18/12/2015 07:15

Essa série está ficando sensacional!

Fernando Deluno Garcia
Fernando Deluno Garcia
Reply to  Igor Borges
18/12/2015 08:47

Olá, Igor.

Obrigado pelo retorno!

Talvez você goste:

Séries



Outros da Série

Menu

WEBINAR
 
BlueNRG-LP – Bluetooth 5.2 de longo alcance para aplicações industriais

Data: 05/11 às 15:00h - Apoio: STMicroelectronics
 
INSCREVA-SE AGORA »



 
close-link