Eu me deparei com duas declarações de ponteiro que estou tendo problemas para entender. Meu entendimento das regras de precedência é mais ou menos assim:
Operator Precedence Associativity
(), [ ] 1 Left to Right
*, identifier 2 Right to Left
Data type 3
Mas, mesmo considerando isso, não consigo descobrir como avaliar os seguintes exemplos corretamente:
Primeiro exemplo
float * (* (*ptr)(int))(double **,char c)
Minha avaliação:
*(ptr)
(int)
*(*ptr)(int)
*(*(*ptr)(int))
Então,
double **
char c
Segundo exemplo
unsigned **( * (*ptr) [5] ) (char const *,int *)
*(ptr)
[5]
*(*ptr)[5]
*(*(*ptr)[5])
**(*(*ptr)[5])
Como devo lê-los?
Respostas:
Meu palpite para o primeiro : ptr é um ponteiro para uma função que assume como parâmetro um int e retorna um ponteiro para uma função que leva como parâmetros um ponteiro para ponteiro para dobrar e um caractere, e retorna um ponteiro para flutuar.
Interpretação :
(* ptr) (int)
diz que ptr é um ponteiro para uma função que usa int como argumento. Para descobrir o que essa função retorna, precisamos expandir nossa visão:
(* (* ptr) (int))
isso significa que a função retorna um ponteiro para outra função. Os parâmetros dessa outra função são:
(duplo **, caractere c)
e retorna
float *
E para o segundo : ptr é um ponteiro para uma matriz de cinco ponteiros para funções que tomam como parâmetros um ponteiro constante para char e um ponteiro para int, retornando um ponteiro para um ponteiro de int não assinado.
Interpretação :
(* (* ptr) [5])
declara ptr como um ponteiro para uma matriz de cinco ponteiros para uma função
(char const *, int *)
como argumentos e retornando
não assinado **
fonte
Você pode tentar o método 'The Clockwise Spiral' para entender essas declarações insanas:
http://c-faq.com/decl/spiral.anderson.html
Também escrevi sobre isso aqui:
http://www.kalekold.net/index.php?post=4
fonte
É um ponteiro de função. A pessoa que o escreveu poderia ter feito melhor uso dos typedefs para torná-lo mais claro.
Na verdade, é um ponteiro para funcionar com esses parâmetros. float * myfunc (duplo **, caractere)
fonte
Usando cdecl.org:
declare bar como ponteiro const para o array 5 do ponteiro para function (int) retornando o ponteiro const para char
declare ptr como ponteiro para a matriz 5 do ponteiro para funcionar (ponteiro para const char, ponteiro para int) retornando ponteiro para ponteiro para não assinado
fonte