c语言复杂性,C语言复杂函数
C语言复杂函数
Int *(*(*pfun)(int *))[10];
看到这样的表达式估计让不少人都“不寒而栗”了吧,其实虽然看起来复杂,但是构造这类表达式其实只有一条简单的规则:按照使用的方式来声明。
首先先介绍一个著名的解析法则
右左法则:首先从圆括号起,然后向右看,然后向左看,每当遇到圆括号时,就调转阅读方向,当括号内的内容解析完毕,就跳出这个括号,重复这个过程直到表达式解析完毕。
其实我们发现,所谓复杂指针离不开指针函数,函数指针,指针数组,函数指针这四个概念并且括号,*比较多,其实只要我们仔细分析这些看起来复杂的表达式,其实他的逻辑也是很清晰的。
使用右左法则解析复杂的表达式:
Int *(*(*pfun)(int *))[10];
首先要找到未定义的标识符pfun,当往右看的时候遇到括号,于是调转方向,再朝相反的方向看,
1 pfun遇到了 * ,说明pfun是一个指针
再往左看又遇到了括号,因此又要调转方向
2 遇到的是另外一个括号,因此说明指针所指向的是一个函数
函数的参数是一个整型指针
3 然后又向相反的方向看,又遇到了一个 说明该函数的返回值又是一个指针*
Int *(* )[10];
在往左看又遇到括号,所以再次调转方向,把内侧的括号里的内容看完,出了括号遇到的是数组
Int * [10];
4 说明指针所指向的函数的返回值类型的指针指向的是数组
这有点向绕口令,但是还是有逻辑可循的。
但是右左法则确实有点麻烦,我们这样看上面这个表达式:首先fpun是一个指向函数的函数指针,该函数有一个整型指针类型的参数并且返回值也是一个指针,所返回的类型指向的是一个数组,并且这个数组有10个元素,每个元素是整型指针类型。
通过一些例子来讨论右左法则的应用
int (*func)(int *pInt);
首先找到那个未定义的标识符,就是func
它的外面有一对圆括号,而且左边是一个号,这说明func是一个指针* int (int *pInt);
然后跳出这个圆括号,先看右边,也是一个圆括号,这说明(*func)指针指向的是一个函数
这类函数具有int类型的形参,返回值类型是 int*。
image-20210323112832649
int (*func1)(int *p, int (*f)(int *));
func1被一对括号包含,且左边有一个号,说明func是一个指针* int (int *p, int (*f)(int *))
跳出括号,右边也有个括号,那么func是一个指向函数的指针
这个函数具有int* 和int ()(int*)这样的形参,返回值为int类型。
再来看一看func的形参int (*f)(int *),类似前面的解释,f也是一个函数指针,
指向的函数具有int*类型的形参,返回值为int
image-20210323114140128
int (int *pInt);
func2右边是一个[]运算符,说明func是一个具有5个元素的数组,
func的左边有一个*,说明func的元素是指针,要注意这里的*不是修饰 func的
image-20210323114645331
(func2[5])指针指向 int (int *pInt)看右边,也是一对圆括号,数组的元素是函数类型的指针*
image-20210323115210656
int (*(*func3)[5])(int *pInt);
func3被一个圆括号包含,左边又有一个,那么func3是一个指针*
忘右看 右边是一个[]运算符号 说明func3是一个指向数组的指针
int (* )(int *pInt) 现在往左看,左边有一个号,说明这个数组的元素是指针*
image-20210323115738444
int (*(*func4)(int *pInt))[5];
func4指针,只向的类型是 (* (int *pInt))函数
函数的形参为 int * 返回值为指针
指针result 指向的 int (*result)[5] 为数组,数组的类型为int
image-20210323120717200
c语言复杂性,C语言复杂函数相关推荐
- c语言中void arrout,c语言学习笔记(数组、函数
<c语言学习笔记(数组.函数>由会员分享,可在线阅读,更多相关<c语言学习笔记(数组.函数(53页珍藏版)>请在人人文库网上搜索. 1.数组2010-3-29 22:40一维数 ...
- predict函数 R_学习|R语言做机器学习的常用函数总结
预测函数:predict() type="prob"判别该量度的昆虫归类为A.B和C的概率:type="response":判别该量度的昆虫的类别: 预测分类的 ...
- C语言中连续调用rand函数,返回值不变
C语言中连续调用rand函数,返回值不变 最近用C语言随机函数编程发现了一个奇怪的现象: 简易版代码: #include<stdio.h> #include<stdlib.h> ...
- R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(添加箱图、带缺口的小提琴图、小提琴图)实战
R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(添加箱图.带缺口的小提琴图.小提琴图)实战 目录 R语言使用ggplot2包geom_jit ...
- R语言可视化、编写自定义函数可视化水平排序条形图(horizontal bar plot)、自定义图像布局模仿经济学人杂志可视化效果、右侧添加标签数值图像方框、自定义背景色、水平条形图中间线条等
R语言可视化.编写自定义函数可视化水平排序条形图(horizontal bar plot).自定义图像布局模仿经济学人杂志可视化效果.右侧添加标签数值图像方框.自定义背景色.水平条形图中间线条.网格线 ...
- R语言编写自定义描述统计计算函数、使用doBy包的summaryBy函数计算不同分组(group)的描述性统计值(Descriptive statistics by group、样本个数、均值、标准)
R语言编写自定义描述统计计算函数.使用doBy包的summaryBy函数计算不同分组(group)的描述性统计值(Descriptive statistics by group using summa ...
- R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(颜色配置:连续色彩、离散色彩、色彩梯度)实战
R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(颜色配置:连续色彩.离散色彩.色彩梯度)实战 目录 R语言使用ggplot2包geom_ji ...
- R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(自定义色彩、形状)实战
R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(自定义色彩.形状)实战 目录 R语言使用ggplot2包geom_jitter()函数绘制分 ...
- R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(双分类变量分组:色彩配置、形状配置)实战
R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(双分类变量分组:色彩配置.形状配置)实战 目录 R语言使用ggplot2包geom_jitt ...
最新文章
- Android进阶:十三、自定义类加载器加载加密类文件
- C++使用命名空间中成员的三种方式
- mysql分页取数每一页生成xml_让MyBatis Generator产生的代码支持分页
- Delphi 中取本机的计算机名、IP地址、Windows登录的用户名
- Python 学习之列表
- 当一个美术生开始在腾讯撸代码… |「递归」第1集
- echo和@echo_如何在Echo Show和Echo Spot上切换到24小时时钟
- oracle 10 expdp impdp 导入、导出
- IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm(转载)
- 关于 width;height
- 巧用MacOS的勿扰模式,解决广告弹窗
- 服务器双系统快捷键,mac双系统切换快捷键
- js 获取图片经纬度及写经纬度
- 跳转指令JMP(04)和跳转结束指令JME(05)
- 虚拟化构建二分图(BZOJ2080 题解+浅谈几道双栈排序思想的题)
- 大白话之哈希表和哈希算法
- 字典树模板及讲解 http://www.cnblogs.com/tanky_woo/archive/2010/09/24/1833717.html
- 22春天津大学《钢筋混凝土结构(1)》在线作业2
- 四、注入(2)渗透测试常用工具
- 如何制作捐赠二维码,实现开源项目或免费应用的捐赠收款(支付宝篇)