2013-06-09 3 views
13

Je lis un morceau de code et je trouve qu'il y a une fonction comme ça.ce qui fonctionne "int (* function()) [10];" signifier?

int (*function())[10]{ 
... 
} 

Je suis confus. Que signifie cette fonction et que va-t-elle retourner?

+13

http://cdecl.org et http://c-faq.com/decl/ spiral.anderson.html – chris

+0

Voir également un tutoriel sur les pointeurs de fonction comme http://www.cprogramming.com/tutorial/function-pointers.html – user1929959

+3

@ user1929959: mais les pointeurs de fonction n'ont rien à voir avec quoi que ce soit dans la question ? –

Répondre

16

C'est la définition d'une fonction qui renvoie un pointeur vers un tableau de 10 entiers. Rappelez-vous que la valeur de retour est un pointeur, pas un tableau réel. Les tableaux ne peuvent pas être retournés depuis les fonctions. Par paragraphe 8.3.5/8 de la norme:

fonctions ne doivent pas avoir un type de retour d'un tableau ou une fonction de type, bien qu'ils puissent avoir un type de retour de pointeur de type ou une référence à ces choses

Voici un exemple simple de la façon dont vous l'utiliser:

int arr[10];  // an array of 10 int 
int (*ptr)[10]; // pointer to an array of 10 int 

int (*function())[10] // function returning a pointer to an array of 10 int 
{ 
    return ptr; 
} 

int main() 
{ 
    int (*p)[10] = function(); // assign to the pointer 
} 

vous pouvez utiliser chaque fois que vous utilisez normalement un pointeur. Mais notez qu'il existe de meilleures alternatives que des pointeurs, comme std::shared_ptr<std::array<T, N>> ou std::shared_ptr<std::vector<T>>.

+0

Est-ce encore utile? : - | Je ne veux pas dire la réponse, je veux dire en spécifiant que la valeur de retour est un pointeur vers un tableau de taille 10. –

+0

@NikosC., Je retournerais un 'std :: tableau ', ou le changerais de façon appropriée si vous réellement besoin de changer l'original. – chris

+1

@NikosC. Oui, nous retournons un pointeur comme n'importe quel autre objet. Un autre avantage est qu'il ne compilera que si la taille du tableau est de 10, aucun type de déclin n'est impliqué. – 0x499602D2

8

La façon de lire est de trouver le plus à gauche identifiant et travailler votre chemin, vous souvenant que () et [] bind avant *, donc *a[] est un tableau de pointeurs, (*a)[] est un pointeur sur un tableau, *f() est une fonction renvoyer un pointeur et (*f)() est un pointeur vers une fonction. Ainsi,

 function   - function 
     function()  - is a function 
    *function()  - returning a pointer 
    (*function())[10] - to a 10-element array 
int (*function())[10] - of int 
+1

Jamais rencontré des fonctions renvoyant des tableaux (ou des pointeurs vers des tableaux avant); le '[]' à droite a l'air bizarre. Je suppose que la prochaine étape dans la complexité serait de déclarer un pointeur sur cette fonction. –

+0

L'autre façon de le regarder est de substituer 'function()' par un symbole 'f', donnant' int (* f) [10] '; maintenant ça n'a pas l'air si bizarre. –

+0

Bien sûr, cela rend parfaitement logique la syntaxe; C'est juste que tu peux coder pendant des années sans tomber sur cette affaire, ça m'a pris au dépourvu ... Je suppose que tu apprends quelque chose tous les jours;) –

0

cela signifie que est un pointeur de fonction et l'argument est nul et retour int [10]

Questions connexes