热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C/C++编程笔记:C语言中的复杂声明分析,用实例带你完全读懂

大多数时候,声明很容易阅读,但是很难读取一些涉及函数指针的声明。例如,考虑“signal.h”中的以下声明。void(*bsd_sign

大多数时候,声明很容易阅读,但是很难读取一些涉及函数指针的声明。

例如,考虑“ signal.h”中的以下声明。

void(*bsd_signal(int, void(*)(int)))(int);

让我们看看读取复杂声明的步骤:

1) 将C声明转换为后缀格式,并从右向左读取。

2) 要将表达式转换为后缀,请从最里面的括号开始,如果不存在最里面的括号,则从声明名称开始,然后右移。第一次遇到结尾括号时,请向左走。解析完整个括号后,便会从括号中出来。

3)继续直到解析完完整的声明。

让我们从简单的例子开始。

1)  int(*fp) ();

让我们将上面的表达式转换为后缀格式。对于上面的示例,没有最里面的括号,因此,我们将打印声明名称,即“ fp”。下一步是转到表达式的右侧,但是“ fp”的右侧没有要解析的内容,这就是为什么转到左侧。在左侧,我们找到了“ *”,现在打印了“ *”,并且没有括号。我们将获得如下的后缀表达式。

  fp *()int

现在从左到右读取后缀表达式。例如fp是指向返回int的函数的指针

让我们看看更多示例。

2) int(*daytab)[13]

后缀:daytab * [13] int

含义:daytab是指向13个整数的数组的指针。

3) void(*f[10]) (int, int)

后缀:f [10] *(int,int)void

含义:f是10个指向函数的指针的数组(该函数需要2个int类型的参数),返回void

4) char(*(*x())[]) ()

后缀:x()* [] *()char

含义:x是一个返回指向指向返回char的指针的数组的函数

5) char(*(*x[3])())[5]

后缀:x [3] *()* [5] char

含义:x是3个指向函数的指针的数组,返回5个char的数组的指针

6) int*(*(*arr[5])()) ()

后缀:arr [5] *()*()* int

含义:arr是5个指向函数的指针的数组,返回指向函数的指针,返回指向整数的指针

7) void(*bsd_signal(intsig, void(*func)(int)))(int);

后缀:bsd_signal(int sig,void(* func)(int))*(int)void

含义:bsd_signal是一个使用整数和指向该函数的指针的函数(该函数以整数作为参数并返回void)并返回指向一个函数(以整数为参数并返回void)

希望对大家有帮助,以上为本期分享内容!

另外如果你想更好的提升你的编程能力,学好C语言C++编程!弯道超车,快人一步!

C语言C++编程学习交流圈子,Q群1030652847点击进入】微信公众号:C语言编程学习基地

分享(源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

编程学习书籍分享:

编程学习视频分享:

 


推荐阅读
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • C语言判断正整数能否被整除的程序
    本文介绍了使用C语言编写的判断正整数能否被整除的程序,包括输入一个三位正整数,判断是否能被3整除且至少包含数字3的方法。同时还介绍了使用qsort函数进行快速排序的算法。 ... [详细]
  • 给定一个二维平面上的一些点,通过计算曼哈顿距离,求连接所有点的最小总费用。只有任意两点之间有且仅有一条简单路径时,才认为所有点都已连接。给出了几个示例并给出了对应的输出。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • 本文介绍了在Windows系统上使用C语言命令行参数启动程序并传递参数的方法,包括接收参数程序的代码和bat文件的编写方法,同时给出了程序运行的结果。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有