um array de ponteiros para funcao do tipo void * (void), ou seja, que recebe void e retorna um ponteiro void. Como e mais comum retornar o endereco do primeiro item do array, entao temos nossa funcao declarada. Criar um ponteiro, neste caso consiste em:void * (**(*fp)(int a,int b,int* pi)) (void);Lindo nao?! Removendo o nome dos parametros fica ainda mais bonito:void * (**(*fp)(int,int,int*)) (void);Mas, acredite, e bem pouco provavel que voce tenha que criar uma loucura dessas, o proposito do meu exemplo e so para demonstrar que ate as funcoes mais loucas podem ter um ponteiro apontando pra elas sem muito trabalho, pelo menos nao e tao absurdo como dizem. Que tal um exemplo disso em funcionamento hehehe:#include <stdio.h>void * fvoid1(void){fprintf(stderr,"fvoid1\n");return NULL;}void * fvoid2(void){fprintf(stderr,"fvoid2\n");return NULL;}void * (*farray[]) () = {fvoid1,fvoid2};void * (**f(int a, int b, int * pi))(void){void *(**fp)() = &farray[0];return fp;}int main(){void * (**(*fp)(int,int,int*)) (void);void * (**a)(void);fp = f;a = (*fp)(10,20,NULL);(*a)();a++;(*a)();return 0;}Atribuir o endereco de uma funcao para um ponteiro de funcao segue o mesmo padrao do resto das coisas em C, digo, se voce criar um ponteiro de funcao que aponte para uma funcao cuja definicao combine com a definicao da funcao printf, pro exemplo, atribuir o endereco e tao simples quanto:pf = printf;Ou voce pode utilizar a forma mais canonica e utilizar o operador & para recuperar o endereco da funcao. Vale lembrar que alguns compiladores vao reclamar da forma direta, entao ja que o jeito certo e o canonico, utilize o jeito certo! Como em:pf = &printf;Para chamar, voce tem duas opcoes, voce pode utilizar a sintaxe:pf(Alo mundo);Desta forma o compilador vai desreferenciar o ponteiro para voce, ou voce pode fazer na mao:(*pf)(Alo mundo);Nao tenho nenhum argumento contra ou a favor a utilizacao de um metodo ou do outro, no maximo eu diria que desreferenciar na mao deixa um pouco mais claro que voce esta utilizando um ponteiro e nao chamando uma funcao chamada pf. Agora vamos tratar os assuntos mais comuns relativos ao uso de ponteiros para funcao. Evitar uma cadeia de if/else gigante ou um switch e funcoes que sao passadas para funcoes*, de certo modo, para implementar uma tecnica conhecida como callback. Pretendo matar dois coelhos com uma cajadada so, e explicar ambos no mesmo exemplo. O problema com as cadeias de if/else ou switch, geralmente, surge quando e necessario fazer a chamada para uma funcao apropriada para algum caso especifico quando a situacao nao pode ser determinada em tempo de compilacao, ou seja, nao ha como saber antes de executar qual funcao deve ser chamada. Vou utilizar o caso mais classico que e o das quatro operacoes basicas (+/-/*/div), o codigo utilizando um switch seria parecido com:#include <stdio.h>float Plus (float a, float b) { return a+b; }float Minus (float a, float b) { return a-b; }float Multiply (float a, float b) { return a*b; }float Divide (float a, float b) { return a/b; }void Solve(float oper1, float oper2, char opCode) { float result=0.0f; switch(opCode) { case '+': result = Plus (oper1, oper2);break; case '-': result = Minus (oper1, oper2);break; case '*': result = Multiply(oper1,