Compartir a través de


Interpretación de declarantes más complejos

Puede agregar cualquier declarador entre paréntesis para especificar una interpretación determinada de un “declarador complejo”. Un declarador complejo es un identificador calificado por más de una matriz, puntero, o modificador de la función.Puede aplicar varias combinaciones de matriz, de puntero, y de modificadores de función a un único identificador.typedef puede utilizarse para simplificar declaraciones.Vea declaraciones de Typedef.

En la interpretación de declarantes complejos, los corchetes y paréntesis (es decir, modificadores a la derecha del identificador) tienen prioridad sobre los asteriscos (es decir, modificadores a la izquierda del identificador).Los corchetes y paréntesis tienen la misma precedencia y asociar de izquierda a derecha.Después de que el declarador se ha interpretado totalmente, aplique el especificador de tipo como el último.Los paréntesis puede reemplazar la asociación predeterminada ordenada y forzar una interpretación determinada.Nunca utilice paréntesis, sin embargo, alrededor de un nombre de identificador en sí mismo.Esto se puede interpretar como lista de parámetros.

Una manera sencilla de interpretar declarantes complejos es leerlos “desde dentro hacia fuera de,” utilizando los cuatro pasos:

  1. Comience con el identificador y vaya directamente a la derecha para los corchetes o paréntesis (si existe).

  2. Interpretar estos corchetes o paréntesis, después busque a la izquierda para asteriscos.

  3. Si encuentra un paréntesis de cierre en cualquier fase, regrese y aplica reglas 1 y 2 están dentro de los paréntesis.

  4. Aplica el especificador de tipo.

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

En este ejemplo, los pasos se numeran en orden y pueden interpretarse como sigue:

  1. se declara el identificador var como

  2. un puntero a

  3. el cambio de la función

  4. un puntero a

  5. una matriz de 10 elementos, que son

  6. punteros a

  7. valores dechar .

Ejemplos

Los ejemplos siguientes muestran las otras declaraciones y presentación complejas cómo paréntesis pueden afectar al significado de una declaración.

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

El modificador de matriz tiene mayor prioridad que el modificador de puntero, lo que var se declara como una matriz.El modificador de puntero aplica al tipo de los elementos de la matriz; por consiguiente, los elementos de matriz son punteros a los valores de int .

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

En esta declaración para var, paréntesis da el modificador de puntero mayor prioridad que el modificador de matriz, y var se declara como puntero a una matriz de cinco valores de int .

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

Los modificadores de la función también tienen mayor prioridad que los modificadores de puntero, por lo que esta declaración para var declara var sea una función que devuelve un puntero a un valor de Más .la función se declara para tomar dos valores de Más como argumentos.

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

Este ejemplo es similar al anterior.Paréntesis da el modificador de puntero mayor prioridad que el modificador de la función, y var se declara como puntero a una función que devuelve un valor de Más .una vez más la función toma dos argumentos de Más .

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

Los elementos de una matriz no pueden ser funciones, pero esta declaración muestra cómo declarar una matriz de punteros a funciones en su lugar.En este ejemplo, var se declara como una matriz de cinco punteros a funciones que las estructuras de vuelta con dos miembros.Los argumentos a funciones se declaran para ser dos estructuras con el mismo tipo de estructura, both.Observe que paréntesis con las *var[5] son obligatorios.Sin ellos, la declaración es un intento no válido de declarar una matriz de funciones, como se muestra a continuación:

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

La instrucción siguiente declara una matriz de punteros.

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

La matriz de name tiene 50 elementos organizados en una matriz multidimensional.Los elementos son punteros a un puntero que es una constante.Puntos constantes de este puntero a una función que no tiene ningún parámetro y devuelve un puntero a un tipo unsigned.

Este ejemplo siguiente es una función que devuelve un puntero a una matriz de tres valores de Doble .

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

En esta declaración, una función devuelve un puntero a una matriz, dado que las funciones que devuelven matrices no son válidas.Aquí var se declara como una función que devuelve un puntero a una matriz de tres valores de Doble .la función var toma un argumento.El argumento, como el valor devuelto, es un puntero a una matriz de tres valores de Doble .Un resumen-declarantecomplejo proporciona el tipo de argumento.Los paréntesis alrededor del asterisco en el tipo de argumento se requieren; sin ellos, el tipo de argumento sería una matriz de tres punteros a los valores de Doble .Para obtener una descripción y ejemplos de declarantes abstractos, vea declarantes abstractos.

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

Mientras que el ejemplo anterior muestra, un puntero puede señalar a otro puntero, y una matriz puede contener matrices como elementos.Aquí var es una matriz de cinco elementos.Cada elemento es una matriz de cinco-elemento de punteros a punteros a las uniones con dos miembros.

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

Este ejemplo muestra cómo la posición de los paréntesis cambia el significado de la declaración.En este ejemplo, var es una matriz de cinco-elemento de punteros a matrices de cinco-elemento de punteros a las uniones.Para obtener ejemplos de cómo usar typedef para evitar declaraciones complejas, vea declaraciones de Typedef.

Vea también

Conceptos

Declaraciones y tipos