Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Peixoto

Ponteiros para função

Recommended Posts

:(

 

Considerem, a duas versões do mesmo programa. Ambas funcionam.

 

Versão 1:

 

#include <stdio.h>#include <stdlib.h>void Escrevenum(int (*func)(int*, int*, int*) );int Textonum(int* num1, int* num2, int* num3 );int main (){   int (*p)(int*, int*, int*); /* Cria ponteiro para a função e define seu   parametro como tipo char*/   p = Textonum; /* Atribui a função texto ao ponteiro p*/   Escrevenum( p );    /* Passa ponteiro para a função como referencia*/   system ("pause");   return 0;}void Escrevenum( int (*func)(int*, int*, int*) ){	 int a=1,b=2,c=3;	 func(&a, &b, &c);       /* Executa função que foi passada como referencia */      return;}int Textonum(int* num1, int* num2, int* num3 ){   printf("%d %d %d\n", *num1, *num2, *num3);   return (0);	}

Versão 2:

 

#include <stdlib.h>void Escrevenum(int (*func)(int, int, int) );int Textonum(int num1, int num2, int num3 );int main (){   int (*p)(int, int, int); /* Cria ponteiro para a função e define seu   parametro como tipo char*/   p = Textonum; /* Atribui a função texto ao ponteiro p*/   Escrevenum( p );    /* Passa ponteiro para a função como referencia*/   system ("pause");   return 0;}void Escrevenum( int (*func)(int, int, int) ){	 func(1, 2, 3);       /* Executa função que foi passada como referencia */      return;}int Textonum(int num1, int num2, int num3 ){   printf("%d %d %d\n", num1, num2, num3);   return (0);	}

Como dito acima, ambas funcionam, entretanto, se diz, que a versão mais correta, é a segunda, isto porque o correto, seria usar ponteiros com parâmetros, quando se usa strings ou tipo char, e não com tipos numéricos. Gostaria de saber o porquê.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pense em termos de assembler. O que é mais rápido, acessar uma posição da memória ou usar registradores?Certamente que usar registradores é mais rápido. Normalmente quando se faz uma chamada a uma função passando os argumentos por valor, o processador faz o seguinte:1) coloca os valores na pilha2) salta para o início da função3) retira os valores da pilha, armazenando-os nos registradores de acordo com a necessidade4) executa o resto da funçãoQuando se envia ponteiros, você estará armazendo na pilha os endereços das variáveis, e as operações são feitas por endereçamento direto (números) ou indireto (strings), que demora mais.No caso de strings não tem muito jeito, é inviável colocá-la toda na pilha, retirá-la depois, armazenando em outras posições de memória, etc. Vai por ponteiros mesmo.Esta é uma idéia básica. Detalhes de como é exatamente a convenção de chamadas depende de seu compilador.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.