Peixoto 0 Denunciar post Postado Fevereiro 24, 2007 :( 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
alexandrehdk 0 Denunciar post Postado Fevereiro 25, 2007 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