est-ce correct?
int (*(*ptr)())[];
6 Réponses :
La règle de droite le rend facile. P>
Démarrer depuis le nom de la variable -------------------------------- Rien à droite mais sauter hors de parenthèses et rencontre Allez à gauche, trouvez saut de parenthèses, allez à droite et appuyez sur Allez à nouveau à gauche, trouvez int (* (* PTR) ()) []; code> peut être interprété comme p>
PTR code> em> p>
) code> est donc laissé à gauche pour trouver
* code> --------------- est un pointeur em> p>
() code> ----------- à une fonction qui ne prend aucun argument (dans le cas de C nombre non spécifié d'arguments) < / em> p>
* code> ------------------------------------ -------------- et retourne un pointeur em> p>
[] code> ----------- à un tableau de em> p>
int code> ------------------------------------ ---
intens code> em>. p>
Il n'y a rien de facile à ce sujet. J'aime utiliser Typefs pour le casser un peu.
Notez que l'exemple n'est pas une déclaration valide - pour en faire un, la taille de la matrice doit être spécifiée.
@CAF: Il rend le type de type incomplet, mais vous pouvez toujours utiliser un pointeur sur un type incomplet dans une déclaration.
@Chals Bailey: Alors ça fait! Je n'avais aucune idée qu'un pointeur sur un type de tableau incomplète était un type utilisable, mais vous y allez. Vous êtes sûrement faire i> apprendre quelque chose de nouveau chaque jour, comme on dit.
Voici ma solution ...
int** (*func)();
Utilisation de CDECL Vous obtenez le suivant
cdecl> declare a as pointer to function returning pointer to array of int; Warning: Unsupported in C -- 'Pointer to array of unspecified dimension' (maybe you mean "pointer to object") int (*(*a)())[]
Dans presque toutes les situations où vous souhaitez retourner un pointeur sur un tableau la chose la plus simple à faire est de renvoyer un pointeur sur le premier élément du tableau. Ce pointeur peut être utilisé dans les mêmes contextes que le nom de la matrice ANI ne fournit plus ni moins d'indirection que de renvoyer un pointeur de type "pointeur au tableau", il tiendra la même valeur de pointeur.
Si vous suivez ce que vous voulez. Un pointeur sur une fonction renvoyant un pointeur sur un Pointeur sur int code>. Vous pouvez construire cela (la construction de déclarations est plus facile que l'analyse). P>
INT code>: p>
int (*(*pfn)())[];
Si vous avez envie de tricher:
typedef int(*PtrToArray)[5]; PtrToArray function(); template<typename T> void print(T) { cout << __PRETTY_FUNCTION__ << endl; } print(function);
vous ne le faites pas. Il suffit de la diviser en deux Typefs: un pour le pointeur sur INT, et un pour un pointeur pour fonctionner. Quelque chose comme: Ce n'est pas seulement plus lisible, il est également plus facile de déclarer / définir les fonctions que vous allez affecter la variable: p> Bien sûr, cela suppose que c'était une situation réelle et non une question d'entrevue ni de devoirs. Je dirais toujours que c'est une meilleure solution pour ces cas, mais ce n'est que moi. :) p> p>
+1 pour le titre principal qui a fait mal au cerveau! (Plus le nom: p)
Pourrait probablement faire une réponse, mais rappelez-vous la règle de spirale dans le sens des aiguilles d'une montre, cela fonctionne à la fois, ajustez simplement la direction.
Boost Boost :: Fonction Quelque chose que vous accepteriez?