Interpretacji bardziej złożonych Declarators
Wszelkie; niewłaściwy deklarator można ująć w nawiasy, aby określić szczególne interpretacji; niewłaściwy "złożonych deklarator." Złożone; niewłaściwy deklarator jest identyfikatorem zakwalifikowanych przez więcej niż jednej tablicy, wskaźnik lub modyfikator funkcji.Różne kombinacje tablicy, wskaźnik i funkcja modyfikatorów można zastosować do jednego identyfikatora.Ogólnie typedef może służyć do uproszczenia deklaracji.Zobacz deklaracje Typedef.
W interpretacji złożonych declarators, nawiasy i nawiasy (to znaczy modyfikatorów z prawej strony pola identyfikatora) pierwszeństwo gwiazdki (to znaczy modyfikatorów po lewej stronie identyfikator).Nawiasy kwadratowe nawiasy mają jednakowe pierwszeństwo i skojarzyć od lewej do prawej.Po pełnej interpretowane; niewłaściwy deklarator specyfikatora typu jest stosowany jako ostatni krok.Za pomocą nawiasów okrągłych można zastąpić domyślną kolejność stowarzyszenia i wymuszanie określonego interpretacji.Nigdy nie używaj nawiasów, jednak ująć nazwę identyfikatora samodzielnie.To może być błędnie zinterpretowana jako lista parametrów.
Prostym sposobem interpretowania declarators złożona jest odczytać je "inside out," przy użyciu następujących czterech krokach:
Uruchom z identyfikatorem i wyglądu bezpośrednio po prawej stronie nawiasów lub nawiasów (jeśli ma zastosowanie).
Zinterpretować te nawiasów ani nawiasów, a następnie sprawdź w lewo gwiazdki.
Jeśli napotkasz nawiasu zamykającego na każdym etapie, wróć i stosować reguły 1 i 2 do wszystko w nawiasach.
Zastosowanie specyfikatora typu.
char *( *(*var)() )[10]; ^ ^ ^ ^ ^ ^ ^ 7 6 4 2 1 3 5
W tym przykładzie kroki są numerowane w kolejności i mogą być interpretowane następująco:
Identyfikator var jest zadeklarowana jako
wskaźnik do
zwracanie funkcji
wskaźnik do
Tablica 10 elementów, które są
wskaźniki do
charwartości.
Przykłady
Poniższe przykłady ilustrują innych deklaracji złożonych i pokazać wpływ rozumieniu deklarację nawiasów.
int *var[5]; /* Array of pointers to int values */
Modyfikator tablica ma wyższy priorytet niż modyfikujący wskaźnik tak var został zadeklarowany jako tablica.Modyfikator wskaźnik stosuje się do typu elementów tablicy; w związku z tym, elementy tablicy są wskaźnikami do int wartości.
int (*var)[5]; /* Pointer to array of int values */
W tej deklaracji dla var, nawiasy nadać modyfikator wskaźnik wyższy priorytet niż modyfikujący tablicy i var został zadeklarowany jako wskaźnik do tablicy pięciu int wartości.
long *var( long, long ); /* Function returning pointer to long */
Modyfikatory funkcji również mają wyższy priorytet niż wskaźnik modyfikatorów, tak tej deklaracji dla var oświadcza, var za zwracanie wskaźnik do funkcji długi wartości.Funkcja jest zadeklarowany jako podjąć dwa long wartości jako argumenty.
long (*var)( long, long ); /* Pointer to function returning long */
W tym przykładzie jest podobny do poprzedniego.Nawiasy nadać modyfikator wskaźnik wyższy priorytet niż modyfikujący funkcji i var został zadeklarowany jako wskaźnik do funkcji, która zwraca long wartości.Ponownie, funkcja przyjmuje dwa long argumentów.
struct both /* Array of pointers to functions */
{ /* returning structures */
int a;
char b;
} ( *var[5] )( struct both, struct both );
Elementy tablicy nie może być funkcji, ale tej deklaracji demonstruje, jak zamiast deklarować tablicy wskaźników do funkcji.W tym przykładzie var został zadeklarowany jako tablica pięciu wskaźników do funkcji, które zwracają struktur z dwóch członków.Argumenty wartości funkcji zostaną zgłoszone do dwóch struktur z tego samego typu Struktura both.Należy zauważyć, że nawiasy wokół *var[5] są wymagane.Bez nich deklaracja jest niedozwolona próba zadeklarowania tablicy funkcje, jak pokazano poniżej:
/* ILLEGAL */
struct both *var[5]( struct both, struct both );
Poniższa instrukcja deklaruje tablicy wskaźników.
unsigned int *(* const *name[5][10] ) ( void );
name Tablica ma 50 elementy zorganizowane w tablicy wielowymiarowej.Elementy są wskaźnikami do wskaźnika, który jest stała.Ten wskaźnik stałej punkty do funkcji, która nie ma parametrów, a następnie zwraca wskaźnik do typu bez znaku.
W tym przykładzie dalej jest funkcja zwraca wskaźnik do tablicy trzech double wartości.
double ( *var( double (*)[3] ) )[3];
W tej deklaracji funkcja zwraca wskaźnik do tablicy, ponieważ funkcje są nielegalne tablice przekazujących dane.W tym miejscu var został zadeklarowany jako funkcja zwraca wskaźnik do tablicy trzech double wartości.Funkcja var ma jeden argument.Argument, podobnie jak wartość zwracana jest wskaźnik do tablicy trzech double wartości.Typ argumentu jest przedstawiana jako kompleks ; niewłaściwy abstrakcyjna deklarator.Nawiasy wokół gwiazdki w polu Typ argument są wymagane; bez nich, typ argumentu byłoby tablicy trzy wskaźniki do double wartości.Omówienie i przykłady abstrakcyjna declarators, zobacz Abstrakcyjna Declarators.
union sign /* Array of arrays of pointers */
{ /* to pointers to unions */
int x;
unsigned y;
} **var[5][5];
Jak pokazano w powyższym przykładzie, wskaźnik można wskazać inny wskaźnik i Tablica może zawierać tablic jako elementy.W tym miejscu var jest tablicą pięciu elementów.Każdy element jest tablica element pięciu wskaźników do wskaźników do związków z dwóch członków.
union sign *(*var[5])[5]; /* Array of pointers to arrays
of pointers to unions */
Ten przykład pokazuje, jak położenie nawiasy zmienia znaczenie deklaracji.W tym przykładzie var jest tablicą element pięciu wskaźników do pięciu elementów tablic wskaźniki do związków.Przykłady sposobów użycia typedef w celu uniknięcia deklaracji złożonych, zobacz Deklaracje Typedef.