基本术语:两个原则:typedef
目标:1.学会解析复杂声明的含义。如:int *(*x[10])(void)。2.typedef简化复杂声明的名称
声明符:int a就是一个声明符。标识符: 定义的变量名字,如: int a,那么a就是一个标识符。 两个原则:
- 始终从内往外读声明符,括号优先级高。即先定位用来声明的标识符,并且从此处的开始解释。
例1.声明 char *p。首先解析*,p是指针指向;再解析char,指针指向的类型是char
例2.声明 void (*pf)(int)。首先在括号内解析*,pf是指针指向;其次(int),指针指向的类型是有int参数的函数;最后void,函数返回值是void。总结:pf是一个指针,它指向了一个参数是int,返回值是void的函数
- 在选择符号解析顺序时,始终是先[]和()后是*。如果*在标识符左边,[]在标识符右边,那么标识符表示的是数组,而不是指针。同理(),表示的是函数。
例:void*pf(int)。首先先解析右边的(int),pf是函数,参数是int类型;其次void*,类型为void类型的指针。总结:pf是函数,函数有一个int类型的参数,返回值是void*
复杂点的例子:
typedefint *(*x[10])(void)。首先解析括号内[10],x是数组;其次*,数组元素是指针指向;再解析(void),指针指向不带参数的函数;最后int *,函数返回值是int类型的指针。总结:x是有10个元素的数组,它的每个元素都是一个指针,指针指向参数为空并且返回值是int*的函数
我们定义一个无符号整型变量x,使用:unsigned long int x;。如果要简化unsigned long int 名称,可以使用typedef, 例如:把unsigned long int改名为x,则定义:
typedef unsigned long int x;
此时x不是一个变量,而是一个简化的unsigned long int别名,但也不能再用x做变量名。
简化别名后,下面两个语句作用相同:
x b; unsigned long int b;
上面提到的int *(*x[10])(void)复杂的声明也同样适用,它要简化为别名x,则定义:
typedef int *(*x[10])(void);
x是个自定义类型。它的类型是有10个元素的数组,数组每个元素都是一个指针,指针指向参数为空并且返回值是int*的函数。下面两个语句作用相同。
x b; int *(*b[10])(void);



