Sdílet prostřednictvím


Interpretace složitější Declarators

Všechny declarator můžete uzavřete do závorek určit konkrétní výklad "komplexní declarator". Komplexní declarator je identifikátor kvalifikované více než jedno pole, ukazatel nebo modifikátor funkce.Identifikátoru můžete použít různé kombinace array, ukazatele a funkce modifikátory.Obecně typedef mohou být použity k zjednodušení prohlášení.Viz deklarace Typedef.

Při interpretaci složité declarators a složené závorky (modifikátory, vpravo identifikátor) přednost hvězdičky (modifikátory, vlevo identifikátor).A složené závorky mají stejnou přednost a přidružit zleva doprava.Po plně vykládat declarator specifikátor typu je použito jako poslední krok.Pomocí závorek lze přepsat výchozí pořadí přidružení a vynutit určitý výklad.Nikdy nepoužívejte závorky, však kolem název identifikátoru sám.To může chybně interpretováno jako seznam parametrů.

Jednoduchý způsob interpretace složité declarators je jejich čtení "zevnitř," pomocí následující čtyři kroky:

  1. Spustit s identifikátorem a vzhledu přímo pravé závorky nebo kulaté závorky (pokud existuje).

  2. Interpretovat tyto závorky nebo kulaté závorky, potom si vlevo pro hvězdičky.

  3. Pokud zaznamenáte pravá závorka v jakémkoli stadiu, přejděte zpět a pravidla 1 a 2 se vztahují na vše v závorce.

  4. Specifikátor typu vztahují.

    char *( *(*var)() )[10];
     ^   ^  ^ ^ ^   ^    ^
     7   6  4 2 1   3    5
    

V tomto příkladu kroky jsou číslovány v pořadí a lze interpretovat takto:

  1. Identifikátor var je deklarován jako

  2. ukazatel na

  3. funkce vrací

  4. ukazatel na

  5. matice 10 prvky, které jsou

  6. odkazy na

  7. charhodnoty.

Příklady

Následující příklady znázorňují jiné složité prohlášení a zobrazit vliv smyslu prohlášení závorky.

int *var[5]; /* Array of pointers to int values */

Modifikátor pole má vyšší prioritu než modifikační ukazatel tak var je deklarován jako matice.Modifikátor ukazatel platí pro typ prvků pole Proto jsou prvky pole ukazatele na int hodnoty.

int (*var)[5]; /* Pointer to array of int values */

V tomto prohlášení pro var, závorky poskytují ukazatele modifikátor vyšší prioritu než modifikační array a var je deklarován jako ukazatele na matici pěti int hodnoty.

long *var( long, long ); /* Function returning pointer to long */

Funkce modifikátory tak také mají vyšší prioritu než ukazatel modifikátory toto prohlášení pro var prohlašuje var se vrací ukazatel na funkci dlouhý hodnotu.Funkce je deklarována vzít dva dlouhý hodnoty jako argumenty.

long (*var)( long, long ); /* Pointer to function returning long */

Je podobný předchozímu příkladu.Závorky poskytují ukazatele modifikátor vyšší prioritu než modifikační funkce a var je deklarován jako ukazatel na funkci, která vrací dlouhý hodnotu.Opět dvě funkce přijímá dlouhý argumenty.

struct both       /* Array of pointers to functions */
{                 /*   returning structures         */
    int a;
    char b;
} ( *var[5] )( struct both, struct both );

Prvky pole nemohou být funkce, ale toto prohlášení ukazuje, jak deklarovat místo pole ukazatelů funkcí.V tomto příkladu var je deklarován jako matice pět ukazatelů na funkce, které vracejí struktur s dvěma členy.Argumenty funkce je prohlášeno za dvě struktury se stejným typem struktury both.Všimněte si, že závorky kolem *var[5] jsou požadovány.Bez nich prohlášení je k neplatnému pokusu deklarovat pole funkce, jak je ukázáno níže:

/* ILLEGAL */
struct both *var[5]( struct both, struct both );

Následující příkaz prohlašuje pole ukazatelů.

unsigned int *(* const *name[5][10] ) ( void );

name Má 50 prvky uspořádány v multidimenzionální pole pole.Prvky jsou ukazatele na ukazatel, který je konstanta.Tato konstanta ukazatel odkazuje na funkci, která nemá žádné parametry a vrací ukazatel na typ bez znaménka.

Dalším příkladu je funkce vrací ukazatel do pole tří dvojité hodnoty.

double ( *var( double (*)[3] ) )[3];

V tomto prohlášení funkce vrací ukazatel na matici, od funkce vracející pole jsou neplatné.Zde var je deklarován jako funkce vrací ukazatel do pole tří dvojité hodnoty.Funkce var trvá jeden argument.Argument jako vrácená hodnota je ukazatel na pole tří dvojité hodnoty.Typ argumentu je dán komplex abstraktní declarator.Závorky okolo hvězdička v argumentu typ jsou požadovány; bez nich by argument typu matice tři ukazatele na dvojité hodnoty.Diskuse a příklady abstraktní declarators najdete Abstraktní Declarators.

union sign         /* Array of arrays of pointers */
{                  /* to pointers to unions       */
     int x;
     unsigned y;
} **var[5][5];

Výše uvedený příklad ukazuje, ukazatel může odkazovat na jiný ukazatel a pole může obsahovat pole jako prvky.Zde var je pět prvků pole.Každý prvek je pět prvek pole ukazatelů a ukazatelů pro dva členy sdružení.

union sign *(*var[5])[5]; /* Array of pointers to arrays
                             of pointers to unions        */

Tento příklad ukazuje, jak se změní umístění závorky smyslu prohlášení.V tomto příkladu var je pět prvek pole ukazatelů na pět prvku matice ukazatelů pro sdružení.Příklady použití typedef aby složité prohlášení, viz Deklarace Typedef.

Viz také

Koncepty

Prohlášení a typy