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语言复杂函数相关推荐

  1. c语言中void arrout,c语言学习笔记(数组、函数

    <c语言学习笔记(数组.函数>由会员分享,可在线阅读,更多相关<c语言学习笔记(数组.函数(53页珍藏版)>请在人人文库网上搜索. 1.数组2010-3-29 22:40一维数 ...

  2. predict函数 R_学习|R语言做机器学习的常用函数总结

    预测函数:predict() type="prob"判别该量度的昆虫归类为A.B和C的概率:type="response":判别该量度的昆虫的类别: 预测分类的 ...

  3. C语言中连续调用rand函数,返回值不变

    C语言中连续调用rand函数,返回值不变 最近用C语言随机函数编程发现了一个奇怪的现象: 简易版代码: #include<stdio.h> #include<stdlib.h> ...

  4. R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(添加箱图、带缺口的小提琴图、小提琴图)实战

    R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(添加箱图.带缺口的小提琴图.小提琴图)实战 目录 R语言使用ggplot2包geom_jit ...

  5. R语言可视化、编写自定义函数可视化水平排序条形图(horizontal bar plot)、自定义图像布局模仿经济学人杂志可视化效果、右侧添加标签数值图像方框、自定义背景色、水平条形图中间线条等

    R语言可视化.编写自定义函数可视化水平排序条形图(horizontal bar plot).自定义图像布局模仿经济学人杂志可视化效果.右侧添加标签数值图像方框.自定义背景色.水平条形图中间线条.网格线 ...

  6. R语言编写自定义描述统计计算函数、使用doBy包的summaryBy函数计算不同分组(group)的描述性统计值(Descriptive statistics by group、样本个数、均值、标准)

    R语言编写自定义描述统计计算函数.使用doBy包的summaryBy函数计算不同分组(group)的描述性统计值(Descriptive statistics by group using summa ...

  7. R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(颜色配置:连续色彩、离散色彩、色彩梯度)实战

    R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(颜色配置:连续色彩.离散色彩.色彩梯度)实战 目录 R语言使用ggplot2包geom_ji ...

  8. R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(自定义色彩、形状)实战

    R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(自定义色彩.形状)实战 目录 R语言使用ggplot2包geom_jitter()函数绘制分 ...

  9. R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(双分类变量分组:色彩配置、形状配置)实战

    R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(双分类变量分组:色彩配置.形状配置)实战 目录 R语言使用ggplot2包geom_jitt ...

最新文章

  1. Android进阶:十三、自定义类加载器加载加密类文件
  2. C++使用命名空间中成员的三种方式
  3. mysql分页取数每一页生成xml_让MyBatis Generator产生的代码支持分页
  4. Delphi 中取本机的计算机名、IP地址、Windows登录的用户名
  5. Python 学习之列表
  6. 当一个美术生开始在腾讯撸代码… |「递归」第1集
  7. echo和@echo_如何在Echo Show和Echo Spot上切换到24小时时钟
  8. oracle 10 expdp impdp 导入、导出
  9. IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm(转载)
  10. 关于 width;height
  11. 巧用MacOS的勿扰模式,解决广告弹窗
  12. 服务器双系统快捷键,mac双系统切换快捷键
  13. js 获取图片经纬度及写经纬度
  14. 跳转指令JMP(04)和跳转结束指令JME(05)
  15. 虚拟化构建二分图(BZOJ2080 题解+浅谈几道双栈排序思想的题)
  16. 大白话之哈希表和哈希算法
  17. 字典树模板及讲解 http://www.cnblogs.com/tanky_woo/archive/2010/09/24/1833717.html
  18. 22春天津大学《钢筋混凝土结构(1)》在线作业2
  19. 四、注入(2)渗透测试常用工具
  20. 如何制作捐赠二维码,实现开源项目或免费应用的捐赠收款(支付宝篇)

热门文章

  1. javaScript事件(二)事件处理程序
  2. ASPxGridView之PreviewRow
  3. 验证视图MAC失败 Validation of ViewState MAC Failed
  4. 重新格式化NameNode后,DataNode启动不起来问题解决
  5. Asp.net Mvc Post ID Bug
  6. 【Linux学习九】负载均衡
  7. P1631 序列合并
  8. 【转】C++中this指针的用法详解
  9. springmvc @responsebody json字符编码
  10. 数据建模学习笔记-2-《高质量数据库建模 2-建模流程》