由于优先级的存在,在一些复杂的定义中,我们很难判断他们是函数还是指针或者是数组,我们可以用一下方法来解决这一类问题。
一、判断数据类型
具体步骤有以下两步:
(1)确定属性(即其为指针?数组?还是函数?)这个主要根据优先级来判断
int (*p)[4] //()的优先级高于[]
//即(*p),很明显这是一个指针
int *p[4] // *的优先级小于[],
//即p[4],很明显这是一个数组
int (*p)() //两个()优先级相同,那么从左到右按顺序运算
//即(*p),这是一个指针
int *p() //()优先级高于*
//p(),这是一个函数
(2)如果是指针,只考虑一个,即其指向的内容;
如果是数组,考虑两个方面,一是长度,二是内容(即每个格子放什么类型的数据);
如果是函数,也要考虑两个方面,一是函数的参数列表,二是函数的返回值。
int (*p)[4] //前面提到这是一个指针
//则考虑指向的内容
//很明显指针指向的是数组
//即指向数组的指针(数组指针)
int *p[4] //数组
//考虑数据类型和大小
//数据类型:int 大小:4
//即存储int型指针的数组(指针数组)
int (*p)() //指针
//考虑指向的内容
//指向的是函数,函数无形参,返回值为int型
//即指向函数的指针(函数指针)
int *p() //函数
//考虑参数列表和返回值
//参数列表:无形参 返回值:int型指针
//即返回int型指针的函数(指针函数)