公众号:嵌入式不难
一、定义举例
void ( * ptr_1)(int);
int ( * ptr_2)[20];
char * ( * ptr_3[30])(void *);
二、分析方法
- 首先需明确C运算符优先级,不明白的可对照度娘来看
- 然后再根据优先级来逐步拆解每一步所代表的含义
- 最后再将拆解开的每一步的含义结合起来就表示这个式子所代表的含义
三、整合含义
void ( * ptr_1)(int);解析
- 第一步:运算符寻找法则。
运算符有 " () " 、" * "
其中 " * " 结合前后文可以确定为指针含义,指明ptr_1是一个指针。 - 第二步:运算符分解法则。
根据 " () " 运算符的结合方向为从左到右,最右边的运算符为 " () " ,可以确定这是一个函数的书写方式,( * ptr_1)这里的括号只是为了提高结合优先级。让 " * " 先与ptr_1结合。 - 第三步:综合分析法则。
综上,ptr_1是一个指针。ptr_1指向返回值为空,带入参数为int型参数的函数。
int ( * ptr_2)[20];解析
- 第一步:运算符寻找法则。
运算符有 " () " 、" * " 、" [] "
其中 " * " 结合前后文可以确定为指针含义,指明ptr_2是一个指针。 - 第二步:运算符分解法则。
" () " 和 " [] " 处于同一个优先级,所以结合性为从左至右,而最右边的运算符为 " [] " ,可以确定这是一个数组的书写方式。而数组名为( * ptr_2)。 - 第三步:综合分析法则。
综上,ptr_2是一个指针。ptr_2指向一个拥有20个元素的一维数组,这个一维数组的每一个元素都是int型数据。
char * ( * ptr_3[30])(void *);解析
- 第一步:运算符寻找法则。
运算符有 " () " 、" * " 、" [] " - 第二步:运算符分解法则。
" () " 和 " [] " 处于同一个优先级,且优先级最高,所以结合性为从左至右,而最右边的运算符为 " () " ,可以确定这是一个函数的书写方式。而函数名为( * ptr_3[30])。然后开始分析( * ptr_3[30]), 这里需要注意( * ptr_3[30])等同于( (* ptr_3)[30]),这一部分为数组书写方式,数组名为(* ptr_3),可以得知ptr_3是一个数组指针。 - 第三步:综合分析法则。
综上,ptr_3是一个指针。ptr_3指向一个拥有30个元素的一维数组,这个一维数组的每一个元素是返回值为char *型,带入参数为void *型的函数指针。