2013-06-09 11 views
13

Przeczytałem fragment kodu i stwierdziłem, że istnieje taka funkcja.co działa funkcja "int (* function()) [10];" oznaczać?

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

Jestem zdezorientowany. Co oznacza ta funkcja i co zwróci?

+13

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

+0

Zobacz także samouczek dotyczący wskaźników funkcji, takich jak http://www.cprogramming.com/tutorial/function-pointers.html – user1929959

+3

@ user1929959: ale wskaźniki funkcji nie mają nic wspólnego z niczym w pytaniu ? –

Odpowiedz

16

Jest to definicja funkcji, która zwraca wskaźnik do tablicy składającej się z 10 liczb całkowitych.

Należy pamiętać, że zwracana wartość to wskaźnik, a nie faktyczna tablica. Tablic nie można zwrócić z funkcji. Zgodnie z pkt 8.3.5/8 Standard:

Funkcje nie mają typ zwracanej tablicy typu lub funkcji, chociaż mogą mieć typ zwracany typ wskaźnika lub odniesienie do takich rzeczy

Oto prosty przykład jak można go używać:

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 
} 

można to wykorzystać wszędzie tam, gdzie normalnie można użyć wskaźnika. Ale zauważ, że istnieją lepsze alternatywy niż wskaźniki w ogóle, jak std::shared_ptr<std::array<T, N>> lub std::shared_ptr<std::vector<T>>.

+0

Czy to jest nawet przydatne? : - | Nie mam na myśli odpowiedzi, mam na myśli określenie, że zwracana wartość jest wskaźnikiem do tablicy o rozmiarze 10. –

+0

@NikosC., Zwrócę 'std :: array ' lub zmienię go odpowiednio, jeśli faktycznie trzeba zmienić oryginał. – chris

+1

@NikosC. Tak, zwracamy wskaźnik jak każdy inny obiekt. Kolejną zaletą jest to, że kompiluje się tylko wtedy, gdy rozmiar tablicy wynosi 10, nie ma to miejsca. – 0x499602D2

8

Droga do odczytu jest znaleźć skrajną lewą identyfikator i swój sposób pracy na zewnątrz, pamiętając, że () i [] wiążą przed *, więc *a[] jest tablicą wskaźników, (*a)[] jest wskaźnikiem do tablicy, *f() jest funkcją zwracanie wskaźnika, a (*f)() jest wskaźnikiem do funkcji. Tak więc,

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

Nigdy nie natrafiono na funkcje zwracające tablice (lub wskaźniki do tablic przed); "[]" po prawej stronie wygląda dziwnie. Sądzę, że następnym krokiem w złożoności byłoby zadeklarowanie wskaźnika do tej funkcji. –

+0

Innym sposobem patrzenia na to jest zastąpienie 'function()' symbolem 'f', dając' int (* f) [10] '; teraz nie wygląda tak dziwnie. –

+0

Oczywiście, czyni to logicznym sensownym pod względem składni; Po prostu możesz kodować przez lata bez natknięcia się na tę sprawę, to mnie zaskoczyło ... Myślę, że uczysz się czegoś każdego dnia;) –

0

oznacza to, że jest to wskaźnik funkcji i argument jest nieważny i powrót Int [10]

Powiązane problemy