从变量名处说起(结合运算符的优先级结合)
int p; //==>>一个普通的整型变量
int *p //==>>
(1)p先与*结合,p是一个指针;
(2)再与int结合,指针所指向的的内容的类型为int;
(3)so,p就是一个返回int类型的指针。
int p[4]; //==>>
(1)p先与[]结合,p是一个数组;
(2)再与int结合,说明数组里的元素是int的;
(3)so,p是一个由int组成的数组。
int *p[4]; //==>>
(1)p先与[]结合,优先级比*高,p是一个数组;
(2)再与*结合,数组的元素是指针类型;
(3)再与int结合,说明指针所指向的内容的类型是int的;
(4)so,p是一个由返回int的指针所组成的数组。
int (*p)[4]; //==>>
(1)p先与*结合,p是一个指针;
(2)再与[]结合,指针所指向的内容是一个数组;
(3)再与int结合,说明数组里的元素是int的;
(4)so,p是一个指向int的指针所组成的数组的指针。
int **p; //==>>
(1)p先与*结合,p是一个指针;
(2)再与*结合,指针所指向的元素是指针;
(3)再与int结合,说明该指针所指向的元素是int的;
(4)so,**p是二级指针。
int p(int); //==>>
(1)p先与()结合,p是一个函数;
(2)再进入()分析,函数有一个int变量的参数;
(3)再与int结合,说明函数的返回值是int的。
int(*p)(int); //==>>
(1)p先与指针结合,p是一个指针;
(2)再与()结合,指针指向的是一个函数;
(3)再与()里的int结合,说明函数有一个int型的参数,
再与最外层的int结合,即函数的返回类型为int ;
(4)so,p是一个指向有一个int参数且返回类型为整型的函数的指针。
int*(*p(int))[3]; //==>>
(1)p先与()结合,p是一个函数;
(2)在()中,与int结合,函数是一个int变量参数;
(3)再与*结合,说明函数返回的是一个指针;
(4)再跟[]结合,说明返回的指针指向的是一个数组;
(5)再与*结合,说明数组里的元素是指针;
(6)再与int结合,说明指针指向的内容是int;
(7)so,p是一个参数为一个int参数且返回一个指向由int指针变量组成的数组的指针指针变量的函数。