9
votes

Comment déclarez-vous un pointeur à une fonction qui renvoie un pointeur à un tableau de valeurs INT en C / C ++?

est-ce correct?

int (*(*ptr)())[];


3 commentaires

+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?


6 Réponses :


16
votes

La règle de droite le rend facile.

int (* (* PTR) ()) []; peut être interprété comme

Démarrer depuis le nom de la variable -------------------------------- PTR

Rien à droite mais ) est donc laissé à gauche pour trouver * --------------- est un pointeur

sauter hors de parenthèses et rencontre () ----------- à une fonction qui ne prend aucun argument (dans le cas de C nombre non spécifié d'arguments) < / em>

Allez à gauche, trouvez * ------------------------------------ -------------- et retourne un pointeur

saut de parenthèses, allez à droite et appuyez sur [] ----------- à un tableau de

Allez à nouveau à gauche, trouvez int ------------------------------------ --- intens .


4 commentaires

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 apprendre quelque chose de nouveau chaque jour, comme on dit.



0
votes

Voici ma solution ...

int** (*func)();


0 commentaires

0
votes

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)())[]


0 commentaires

6
votes

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 int code>. Vous pouvez construire cela (la construction de déclarations est plus facile que l'analyse). P>

Pointeur sur INT code>: p>

int (*(*pfn)())[];


0 commentaires

1
votes

Si vous avez envie de tricher:

typedef int(*PtrToArray)[5];
PtrToArray function();

template<typename T> void print(T) {
    cout << __PRETTY_FUNCTION__ << endl;
}

print(function);


0 commentaires

2
votes

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: xxx

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: xxx < / Pré>

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. :)


0 commentaires