Ponteiro em C: Funções

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

Neste artigo serão discutidos alguns tópicos em que ponteiros e funções são utilizados. Uma das vantagens obtidas com ponteiros é a capacidade de alterar o valor de variáveis que estão em escopos diferentes do programa. Neste caso, será detalhada a chamada de função com passagem de valores por referência. Outro tópico interessante é caracterizado por chamar as funções a partir de ponteiros!

Chamada por Referência

Quando fazemos a chamada de uma função podemos passar argumentos, caso existam, num processo conhecido como chamada por valor. Esse processo é caracterizado por copiar os valores dos argumentos para os parâmetros da função. Outro método de passar um valor para função é denominado chamada por referência.  Nesse procedimento o endereço do argumento é passado para função, logo temos que utilizar ponteiros para manipular os endereços!

No exemplo mostrado abaixo, o endereço do vetor é passado para função.

Esse processo é interessante, pois possibilita que alterações realizadas em um parâmetro dentro de uma função alterem o valor do argumento, que está em outro escopo. Nesse exemplo, o conteúdo do vetor é alterado em um escopo diferente de onde foi declarado. O mesmo pode ser realizado com variáveis comuns, sendo necessário utilizar o operador ‘&’ para obter o endereço da variável.

Retornando um Ponteiro

Uma função pode retornar qualquer tipo de dado válido em C, portanto pode retornar um ponteiro! Uma função que retorna um ponteiro deve declarar explicitamente qual o tipo de ponteiro que está retornando [1], pois como vimos no segundo artigo as operações aritméticas com ponteiros são relativas ao tipo de dado.

Por exemplo, a função strerror() devolve um ponteiro para uma string definida para um determinado valor de errnum. A assinatura da função é mostrada abaixo.

Outro uso comum é na utilização das funções de alocação dinâmica de memória, na qual as operações sempre utilizam endereço de blocos de memória. É claro que o retorno de ponteiros pode ser empregado em vários contextos e não fica limitado só aos exemplos deste artigo.

Ponteiro para Funções

Outro recurso muito poderoso da linguagem C é dado pela possibilidade de utilizar ponteiros para chamada de funções. Isso é possível porque as funções possuem endereço fixo, também chamado de ponto de entrada da função. Deste modo, um ponteiro para função deve ser declarado conforme a assinatura da função que será chamada. Considere as duas funções mostradas abaixo.

Note que as duas diferem apenas no nome. De fato, as assinaturas são equivalentes. Agora, considere que outra função recebe uma mensagem e um código que representa o tipo da mensagem.

Esse contexto pode ser alterado criando um ponteiro para função com assinatura equivalente. O tipo do ponteiro para função é definido abaixo.

Observe que a assinatura é parecida com a declaração de uma função e que o typedef define um novo tipo chamado ptrF. A chamada de uma função utilizando um ponteiro é bem simples.

(*<nome do ponteiro>)(<argumentos para os parâmetros>);

Cabe ressaltar que os parênteses em torno de ‘*<nome do ponteiro>’ são necessários para que o compilador interprete corretamente da operação. Assim, a aplicação pode ser alterada para utilizar o recurso de ponteiro para função. Uma possível alteração é a criação de um vetor de ponteiros com as funções que podem ser executadas. É importante lembrar que o endereço de uma função é obtido a partir do seu nome.

Outra solução possível seria receber o endereço da função em um parâmetro de outra função.

O teste dessas funções é mostrado abaixo.

Outra aplicação de ponteiro para funções foi apresentada num artigo do Rodrigo Almeida e do Marcelo Barros. Vale a pena conferir!

Conclusão

Neste artigo foram apresentados três tópicos referentes a ponteiros e funções. Fica demonstrado que os ponteiros podem ser utilizados para manipular dados declarados em escopos diferentes, possibilitando estruturar uma aplicação com funções. Outro recurso apresentado foi o de chamada de funções utilizando ponteiros. Essa característica permite maior flexibilidade para execução e alteração da aplicaçã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: ArraysPonteiro em C: Estruturas >>
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: Funções
Comentários:
Notificações
Notificar
guest
6 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Biro biro
Biro biro
30/12/2018 17:03

Sei que é um post meio antigo, mas resolvi comentar porque talvez ajude outras que pessoas que assim como eu estão começando na linguagem.. na parte referente a ponteiros para funções, existe o seguinte código ... //assinatura da função para exibir uma mensagem void ExibirMensagem(char * msg, int tipo); void ExibirMensagem(char * msg, tMsg tipo) ... o tipo de dado na assinatura conflita com tipo de dado mencionado na definição da função em si, além de estar faltando o enum, então o correto seria: ... //assinatura da função para exibir uma mensagem void ExibirMensagem(char * msg, enum tMsg tipo); void… Leia mais »

Adriano Santos
12/01/2016 22:08

Concordo totalmente com o Rafael Dias.

Amo programação e tento me aprofundar a cada dia mais, o bom é saber que temos conteudo dessa valia a nossa disposição na internet!

Meu Perfil:Adriano Santos
Profissão: Comunicação Visual
São Paulo – SP

Fernando Deluno Garcia
Fernando Deluno Garcia
Reply to  Adriano Santos
15/01/2016 10:47

Olá, Adriano.

Fico feliz que tenha gostado.

Obrigado!

Rafael Dias
Rafael Dias
22/12/2015 10:19

Ponteiros para função é um dos recursos mais poderosos de C. Utilizando ponteiros para função e estruturas é possível implementar OOP em C, o quê é uma coisa muito interessante.

A meu ver, ponteiros tem que fazer parte do dia a dia de qualquer programador, independente de qual área for.

Parabéns pelo artigo.

Fernando Deluno Garcia
Fernando Deluno Garcia
Reply to  Rafael Dias
24/12/2015 17:33

Olá, Rafael.

Nos próximos artigos vou falar um pouco sobre OOP, principalmente sobre polimorfismo. Como você disse, esse é um recurso poderoso. Além disso, permite modelar uma aplicação de várias formas.

Eu concordo plenamente com você. Independente de linguagem, os conceitos de ponteiros e endereços são fundamentais.

Obrigado pelo retorno!

trackback
04/01/2016 14:28

[…]  1Funções – Série Ponteiro em C – Embarcados  […]

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