例子:char * const *(*next)();
规则:
1.声明从名字开始读取,然后按照优先级进行依次读取;
2.优先级从高到底的顺序:
2.1 小括号中的部分。
2.2 后缀操作符:
例如:小括号(),中括号[]
2.3 前缀操作符:
例如:*星号(一般解释为指向什么的指针)
3.关键字如const等在类型说明符后面的那么当做类型说明符的修饰来用。
第一层: (*next) :next是一个指针
第二层: (*next)():说明这个整体是一个函数,next是一个函数的地址; 注释(后缀操作符的优先级大于前缀操作符)
第三层:*(*next)():把他看成*x,说明它是一个指针(进一步说明这个函数的返回值是一个地址)
第四层:char * const *(*next)():简写成char * const p,说明p是一个指向char类型的常量指针。
总结:next是一个指向函数的指针,他返回的值,也是指向一个char类型的常量指针。
例子:char *(* c[10])(int **p);
typedef用法(函数部分):
typedef void (*ptr_to_fun)(int); 表示ptr_to_fun指向一个函数,这个函数接受int类型的参数,并且返回值是void类型
typedef用法(数据类型部分): 主要是用来给数据类型创建别名
typedef int (*arryay_ptr)[100];
typedef用法(结构体部分):
typedef struct fruit(int age);其中的fruit是结构标签,可以用结构标签来定义变量
typede 与宏定义的区别:
1.宏定义的名字可以用其他类型说明符进行扩展,而typedef 定义的就不能用其他的其他类型说明符进行定义。(typedef是进行了彻底的封装)
例子:
#define INTE int
unsigned INTE I;允许
typedef UINTE int;
unsigned UINTE i;不允许
2.通过宏定义一次性声明的变量,变量的类型可能不一样(指针类型),重命名就不会