解释更复杂的声明

可以在小括号所有声明指定 “复杂声明的特定说明”。复杂声明为多个数组、指针或函数修饰符限定标识符。 可以将数组、函数指针和修饰符的各种组合于单个标识符。 通常 typedef 可用于简化声明。 Typedef 声明参见。

在解释复杂声明,括号和括号 (即标识符右侧的修饰符) 优先于星号 (即标识符左侧的修饰符)。 括号和括号具有相同的优先级和从左向右联合。 在声明完全解释后,该类型说明符将用作最后一个步骤。 通过使用括号您可以重写默认值关联序列和强制特定说明。 不要在标识符名称周围使用括号,但是,单独。 这会被错误解释为参数列表。

一种简单方式解释复杂声明将读取它们 “从深入浅出 ",”使用以下四个步骤:

  1. 从标识符和查找启动直接在括号或括号的右侧 (如果有)。

  2. 解释这些括号或括号,然后查看左侧为星号。

  3. 如果遇到一个右括号在任何阶段,返回并应用于所有的规则 1 和 2 的括号中。

  4. 将自定义类型说明符。

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

在此示例中,步骤按顺序计算,并可以解释如下:

  1. 该标识符 var 声明

  2. 指针

  3. 函数返回

  4. 指针

  5. 数组 10 个元素,。

  6. 指针

  7. char 值。

示例

下面的示例阐释了其他复杂声明并显示圆括号如何影响声明的含义。

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

数组修饰符与修饰符指针具有高优先级,因此, var 声明为数组。 指针修饰符也适用于数组元素的类型;因此,数组元素是指向 int 值。

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

在 var的此声明,括号比数组修饰符使指针修饰符高优先级,因此, var 声明为指向五个 int 值。

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

函数指针修饰符与修饰符也具有高优先级,因此, var 的此声明 var 是返回指针的函数。 long 值。 函数声明了两个 long 值作为参数。

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

此示例与前一个示例相似。 括号比函数修饰符使指针修饰符高优先级,因此, var 声明为指向 long 返回值的函数。 同样,该函数采用两个 long 参数。

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

数组的元素不能是函数,但是,本文档演示如何声明数组指针给函数。 在此示例中, var 声明为数组五指向返回包含两个成员的结构的功能。 函数的参数声明与同一结构类型的两个结构, both。 请注意需要括起来 *var[5] 的括号。 不包括属性,声明是一个非法尝试声明函数,如下所示:

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

下面的语句声明数组的指针。

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

name 数组的组织的 50 个元素在多维数组。 元素是指向是常数的指针。 此常量指针指向没有参数的函数并返回指向无符号类型。

下一个示例是返回指针的函数应用于三个 二进制文件 值。

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

对此声明,数组,因为返回的函数是非法的,函数返回指向数组。 此处 var 声明为返回指针的函数应用于三个 二进制文件 值。 函数 var 采用一个参数。 参数,如返回值,是指向三个 二进制文件 值。 复杂 抽象声明为参数类型。 在参数类型需要在星号两边的括号;不包括属性,参数类型是三分球到 二进制文件 值。 有关抽象声明的讨论和示例,请参见 抽象声明

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

在上面的示例所示,指针可以指向其他指针,因此,数组可包含数组作为元素。 在此处 var 数组五个元素。 每个元素是五个元素数组的指针的指针与两个成员的联合。

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

此示例演示括号的位置如何更改标题的含义。 在此示例中, var 是五个元素的指针的数组到五个元素一些指向联合。 有关如何使用 typedef 的示例为了避免复杂性说明,请参见 Typedef 声明

请参见

概念

声明和类型