要理解复杂类型其实不难,一个类型里面也会出现一些运算符,有优先级,在搞清楚优先级之后,复杂类型判断的难题就迎刃而解了。
int p;
//这是一个普通的整形变量
int *p;
//首先从P处开始,先与*结合,说明P是一个指针,再与int类型结合,说明指针所指向的内容类型为int型
int p[3];
//P与[]先结合,说明P是一个数组,再与int相结合,表示数组中的元素是int型
int *p[3];
//P与[]先结合,说明P是一个数组,再与*结合,说明数组中的元素是指针,再与int结合,说明元素中这些指针指向的数据类型为int型
int (*p)[3];
//()改变了优先级,P先与*结合,说明P是一个指针,再与[]结合,说明该指针指向一个数组,再与int结合,说明改该数组中的元素为int型
int **p;
//P与先结合,说明P是一个指针,再与结合,说明这个指针指向一个指针,再与int结合,说明这个指针指向的数据类型为int型
int p(int);
//P先与()结合,说明P是一个函数,再与()中的int结合,说明这个函数有一个形参的类型为int型,再与int结合,说明该函数的返回值为int型
int (*p)(int);
//P先与*结合,说明P是一个指针,再与()结合,说明该指针指向的是一个函数,再与()中的int结合,说明P指针指向的这个函数的参数为int型,再与int结合,说明这个函数的返回值为int类型
int *(*p(int))[3];
//P与()先结合,说明P是一个函数,再与()中的int结合,说明函数的形式参数为int型,再与结合,说明函数返回的是一个指针,再与[]结合,说明这个指针指向的是一个数组,再与结合,说明这个数组中的元素是指针,再与int结合,说明这个数组中的指针指向的是int型。