解释更复杂的声明
可以在小括号所有声明指定 “复杂声明的特定说明”。复杂声明为多个数组、指针或函数修饰符限定标识符。 可以将数组、函数指针和修饰符的各种组合于单个标识符。 通常 typedef 可用于简化声明。 Typedef 声明参见。
在解释复杂声明,括号和括号 (即标识符右侧的修饰符) 优先于星号 (即标识符左侧的修饰符)。 括号和括号具有相同的优先级和从左向右联合。 在声明完全解释后,该类型说明符将用作最后一个步骤。 通过使用括号您可以重写默认值关联序列和强制特定说明。 不要在标识符名称周围使用括号,但是,单独。 这会被错误解释为参数列表。
一种简单方式解释复杂声明将读取它们 “从深入浅出 ",”使用以下四个步骤:
从标识符和查找启动直接在括号或括号的右侧 (如果有)。
解释这些括号或括号,然后查看左侧为星号。
如果遇到一个右括号在任何阶段,返回并应用于所有的规则 1 和 2 的括号中。
将自定义类型说明符。
char *( *(*var)() )[10]; ^ ^ ^ ^ ^ ^ ^ 7 6 4 2 1 3 5
在此示例中,步骤按顺序计算,并可以解释如下:
该标识符 var 声明
指针
函数返回
指针
数组 10 个元素,。
指针
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 声明。