美文网首页C/C++
C语言复杂函数

C语言复杂函数

作者: 蒋斌文 | 来源:发表于2021-03-23 12:08 被阅读0次

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语言复杂函数 看到这样的表达式估计让不少人都“不寒而栗”了吧,其实虽然看起来复杂,但是构造这类表达式其实只有一条...

  • iOS开发 -- C语言基础3(函数)

    iOS开发 -- C语言基础3(函数) 什么是函数 一、函数的分类 C语言中的函数就是面向对象中的"方法",C语言...

  • Go语言里面的变量作用域问题

    变量的作用域,通常有包package范围、函数func范围、或者闭包closure范围, go语言毕竟比C语言复杂...

  • c语言基础-复杂的函数指针

    分析方法:右左法,遇到括号返方向int (* func)(int * p);分析: func - 右) - 左 *...

  • gcc

    C语言 c语言是面向函数的语言,所以c语言中全部都是函数 看看单文件中对函数的生命和调用。 要先对函数进行声明再进...

  • 是否还需要在源文件中添加“extern C”?

    c++调用c语言的函数时我们一般在c语言函数声明处用extern "C"包c函数。例如: extern "C"的主...

  • 2018-08-29日常C笔记

    C语言初学笔记 C语言程序是由函数组成的C语言程序启动时,系统就会自动调用名字叫main的函数C语言规定了函数定义...

  • Redis 源码简洁剖析 02 - SDS 字符串

    C 语言的字符串函数 C 语言 string 函数[https://devdocs.io/c-strings/],...

  • 函数变参的使用

    介绍C/C++,java,和go语言对函数变参的使用。 1. C/C++语言的变参 1.1 变参函数声明 变参函数...

  • python函数参数

    python函数的参数是目前见过最复杂的参数了。 C语言里用的最多的可变参数函数就是scanf和printf了,j...

网友评论

    本文标题:C语言复杂函数

    本文链接:https://www.haomeiwen.com/subject/sjqfhltx.html