(先看分析,再回来看,就当小测验)
int *str[5]; (指向int类型数据的)指针数组
int (*str)[5]; (int类型的)数组指针
int *a(void*); (指向int类型数据的)指针函数
int (*a)(void); (返回值为int类型)函数指针
int* *a[5](int,char); (**a为int型)返回值为二级指针函数数组
void*(*a)[5](void*,int*); (返回值为void类型指针的)函数数组指针
理解分析
直接分析优先级,不需死记硬背,首先看下图(网图截图,完整版直接搜索运算优先级):
1、()、[]优先级最高,同时存在时按从左到右进行运算 ;*是一元运算符,有两种用法一是定义,二是取指针指向的数据,在定义中可以把*当成运算符来进行理解,此时优先级排第二,同类型从右往左进行运算;定义的类型优先级排最后。
2、一个复合名词,不管是汉语还是英语都有定语的概念,就如“复合名词”,可以理解为“复合的名词”,这句话中“名词”的定语就是”复合“,在前面的就是定语,就是修饰。
具体分析如下:
char *p[5];
:由上可知[]优先级最高,所以这里定义的首先是个
数组
,然后再是
指针
,而指针又指向
char类型的数据
,“char类型指针” 就是 “数组” 的定语,合起来就是
指向char类型的指针的数组。再展开就是定义了一个数组,数组里面存放了5个指针,而指针指向的是char数据。
由上应该分析得差不多了,下面直接来个难的。
void* (*a)[20](int,char*);
:先给答案:
返回值为void指针函数数组指针
。这里同时出现了(*a)、[20]、(int,char*)三个括号,按优先级来看是从左到右进行运算,所以首先是个指针,然后是个数组,再就是个函数,而最后的void*直接放最后修饰函数,合并起来就是返回值为void类型的指针的函数的数组的指针。再展开,就是一个指针,指针指向一个数组(首地址),而数组里面存放了20个函数,这些函数的返回值都是void指针。
相对于很多大神来说,我才刚入门,以上都是我自己研究摸索(当然少不了上CSDN搜索)所理解的全部,因为我就是,这么一步步学习过来,也知道这一块理解不易,发现很多讲得都不是很清楚,对于我这种喜欢刨根知底的来说很不舒服,也希望这篇文章可以帮助到像我一样的小白,可以让大家不用死记硬背,直接上理解。
语言功底、学识有限,有问题可以多多包涵并指出我的错误,大家一起学习进步。