Condividi tramite


Interpretazione dei dichiaratori più complessi

È possibile racchiudere il dichiaratore tra parentesi per specificare un'interpretazione particolare “di un dichiaratore complesso.„ Un dichiaratore complesso è un identificatore qualificato da più di un matrice, puntatore, o modificatore di funzione.È possibile applicare le varie combinazioni di matrice, di puntatore e di modificatori di funzione a un singolo identificatore.Generale typedef può essere utilizzato per semplificare le dichiarazioni.vedere Dichiarazioni typedef.

Nell'interpretazione dei dichiaratori complessi, le parentesi e le parentesi (ovvero modificatori a destra dell'identificatore) hanno la precedenza sull'asterisco (ovvero modificatori a sinistra dell'identificatore).Le parentesi e le parentesi hanno la stessa precedenza e associare da sinistra a destra.Dopo che il dichiaratore è stato completamente interpretato, l'identificatore del tipo viene applicato come ultimo passaggio.Utilizzando le parentesi è possibile eseguire l'override di quello predefinito di associazione e imporre un'interpretazione particolare.Non utilizzare mai le parentesi, tuttavia, intorno al nome dell'identificatore da sola.Questa situazione può essere interpretato erroneamente come elenco di parametri.

Un modo semplice per interpretare i dichiaratori complessi è di leggerli “da all'esterno,„ utilizzando i seguenti quattro passaggi:

  1. Iniziare con l'identificatore e l'aspetto direttamente a destra per parentesi o parentesi (se presente).

  2. Interpretare tali parentesi o parentesi, quindi cercare sinistra per gli asterischi.

  3. Se si verifica una parentesi destra a qualsiasi fase, tornare indietro e applicare le regole 1 e 2 all'interno delle parentesi.

  4. Applicare l'identificatore del tipo.

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

In questo esempio, i passaggi sono numerati in sequenza e possono essere interpretati come segue:

  1. l'identificatore var è dichiarata come

  2. un puntatore a

  3. restituzione di funzione

  4. un puntatore a

  5. una matrice di 10 elementi, che vengono

  6. puntatori a

  7. char valori.

Esempi

Negli esempi seguenti vengono illustrate altre dichiarazioni complesse e illustrano le parentesi possono influire sul significato di una dichiarazione.

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

Il modificatore di matrice ha priorità più alta che il modificatore del puntatore, pertanto var viene dichiarato come una matrice.Il modificatore del puntatore viene applicato al tipo degli elementi di matrice, pertanto, gli elementi di matrice sono puntatori a int valori.

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

in questa dichiarazione per var, le parentesi forniscono la priorità più elevata di modificatori di puntatore che il modificatore di matrice e var viene dichiarato come un puntatore a una matrice di cinque int valori.

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

I modificatori di funzione hanno priorità più alta che i modificatori del puntatore, pertanto questa dichiarazione per var dichiara var per essere una funzione che restituisce un puntatore a un oggetto tempo valore.La funzione viene dichiarata per accettare due tempo valori come argomenti.

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

L'esempio è analogo a quello precedente.Le parentesi includono la priorità più elevata di modificatori di puntatore che il modificatore di funzione e var viene dichiarato come un puntatore a una funzione che restituisce un' tempo valore.Di nuovo, la funzione accetta due tempo argomenti.

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

Gli elementi di una matrice non possono essere funzioni, ma questa dichiarazione viene illustrato come dichiarare una matrice di puntatori a funzioni invece.in questo esempio, var viene dichiarato come una matrice di cinque puntatori a funzioni che strutture di ritorno con due membri.Gli argomenti a funzioni sono dichiarati come due strutture con lo stesso tipo di struttura, both.Si noti che racchiudere di parentesi *var[5] rendere obbligatoria.Senza di esse, la dichiarazione è un tentativo non valido di dichiarare una matrice di funzioni, come illustrato di seguito:

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

Nell'istruzione dichiara una matrice di puntatori.

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

name la matrice contiene 50 elementi organizzati in una matrice multidimensionale.Gli elementi sono puntatori a un puntatore che è una costante.Punti costanti di questo puntatore a una funzione che non ha parametri e restituisce un puntatore a un tipo unsigned.

L'esempio seguente è una funzione che restituisce un puntatore a una matrice di tre doppio valori.

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

In questa dichiarazione, una funzione restituisce un puntatore a una matrice, poiché le funzioni che restituiscono matrici non sono valide.qui var viene dichiarato come una funzione che restituisce un puntatore a una matrice di tre doppio valori.la funzione var accetta un argomento.L'argomento, come valore restituito, è un puntatore a una matrice di tre doppio valori.Il tipo di argomento viene fornito da un oggetto complesso astratto-dichiaratore.Le parentesi attorno all'asterisco nel tipo di argomento sono necessarie; senza di essi, il tipo di argomento è costituito da una matrice di tre puntatori a doppio valori.Per una discussione e gli esempi di dichiaratori astratti, vedere sottrarre i dichiaratori.

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

Come illustrato sopra di esempio, un puntatore può indicare un altro puntatore e una matrice può contenere matrici come elementi.qui var è una matrice di cinque elementi.Ogni elemento è una matrice dell'cinque-elemento dei puntatori ai puntatori a unioni con due membri.

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

In questo esempio viene illustrato come la posizione delle parentesi modifica il significato della dichiarazione.in questo esempio, var è una matrice dell'cinque-elemento dei puntatori alle matrici dell'cinque-elemento dei puntatori a unioni.Per esempi di utilizzo typedef per evitare le dichiarazioni complesse, vedere Dichiarazioni typedef.

Vedere anche

Concetti

Dichiarazioni e tipi