指针、数组、函数的各种组合

  • Post author:
  • Post category:其他


(先看分析,再回来看,就当小测验)

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类型指针的)函数数组指针

理解分析

直接分析优先级,不需死记硬背,首先看下图(网图截图,完整版直接搜索运算优先级):

b41b40a363f24db3bfe57f23da10ca7d.png

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搜索)所理解的全部,因为我就是,这么一步步学习过来,也知道这一块理解不易,发现很多讲得都不是很清楚,对于我这种喜欢刨根知底的来说很不舒服,也希望这篇文章可以帮助到像我一样的小白,可以让大家不用死记硬背,直接上理解。

语言功底、学识有限,有问题可以多多包涵并指出我的错误,大家一起学习进步。



版权声明:本文为qq_42774608原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。