C语言中有时会出现复杂的声明,比如
 
   char * const * (*next) (); //这是个什么东东?
 
   在讲复杂声明的分析方法前,先来个补充点。
 
   C语言变量的声明始终贯彻两点 :
 
   1.声明和使用的语法尽量保持一致
 
   例如:
 
   #include
 
   using namespace std;
 
   double (*fun)(double); //声明一个函数指针
 
   int main(){
 
   fun=sin;
 
   doube reslut=(*fun)(0.5);//使用这个函数指针
 
   ...
 
   }
 
   2.声明语句不是的阅读不是按照从左往右的阅读顺序,而是要根据各个符号的优先级进行阅读的
 
   这点非常重要!先列出C语言声明的优先级规则,再举个例子就能掌握求解方法了。
 
   C语言声明的优先级规则
 
   A 声明从它的名字开始读取,然后按照优先级顺序依次读取;
 
   B 优先级从高到低依次是:
 
   B.1 声明中被括号括起来的那部分;
 
   B.2 后缀操作符:
 
   括号()表示这是一个函数,而
 
   放括号[]表示这是一个数组;
 
   B.3 前缀操作符:星号*表示这是一个“指向...的指针”;
 
   C 如果const和(或)volatile关键字的后面紧跟类型说明符(如int,long等),那么它作用于类型说明符。在其他情况下,它作用于关键字左边紧邻的指针星号。
 
   需要强调的一个重要注意点是,对于优先级: () > [] > * 。
 
   举例,用优先级规则分析C语言声明一例:
 
   char * const * (*next) ();
 
   按照规则解读 char * const * (*next) ();
 
   首先,(*next) 表示next是一个指针,它指向某个东东;
 
   根据B.2和最右边的括号,next指向一个函数;
 
   根据B.3,第二个星号表示,该函数返回一个指针;
 
   char * const是函数返回的指针所指向的类型;
 
   char* 是字符指针,const修饰左边的星号,即字符指针是常量的,该指针不可修改(该指针指向的字符内容是可修改的);
 
   综合地表述为,next是一个指针,它指向一个函数,该函数返回一个指针,该指针指向一个类型为char的常量指针。
 
   还是不明白?再往下看就明白了 www.yztrans.com
 
   #---------------------------------------------------------------------------------#
 
   总结一下,分析复杂的C语言声明,要采用"由内而外,层层剥离 ”的策略。
 
   从哪里开始剥?从语句的最左边的标志符开始剥(上例为从next开始)。
 
   往哪个方向剥?依照C语言的优先级规则一层层剥。
 
   #---------------------------------------------------------------------------------#
 
   再举一例作详细说明:
 
   char *(* c[10]) (int **p);
 
   第一步,char *(* c [10]) (int **p); 最左边的标志符是c,表示"c是一个什么东东";
 
   第二步,char *(* [10] ) (int **p); 和[10]结合,表示"c是一个长度为10的数组";
 
   第三步,char *(* ) (int **p); 和*结合,表示"这个数组存放着指针";
 
   第四步,char * (int **p) ; 和(int **p)结合,表示"这个指针指向一个函数,函数的参数是二维指针";
 
   第五步,char * ; 和 * 结合,表示"这个函数返回一个指针";
 
   第六步,char          ; 这个指针指向一个字符;
 
   把上面六步串起来,读作: c是一个数组[0..9],它存放着指针,指针指向的函数参数是一个二维指针返回值是指向字符的指针。完工!
 
   #---------------------------------------------------------------------------------#
 
   注1: 这个方法若理解了,什么指针数组和数组指针、指针函数和函数指针等等之类的区别都是小菜一碟了。
 
   注2: 合法的声明中存在限制条件。如函数的返回值不能是一个函数,也不能是一个数组,所以像function()()和function()[]是非法的,不能出现。
 
   数组里面能存函数指针,但不能存函数,像int (* function[])()是合法的,function[]()则是非法的托福答案 www.lefeng123.com

转载于:https://www.cnblogs.com/tianchaoy/p/3568883.html

如何解析复杂的C语言声明相关推荐

  1. C语言声明知识体系总结大学霸IT达人

    C语言声明知识体系总结大学霸IT达人 声明(declaration)决定一个或多个标识符的重要性和属性.所声明的标识符可以是对象的名称.函数的名称等. 对象和函数的标识符可以有各式各样的类型和范围.在 ...

  2. 【译】Go语言声明语法

    引言 Go语言的初学者可能会好奇为什么Go的类型声明语法和传统的C系语言不同.本篇文章我们将比较这两种不同的类型声明方式,解释为什么Go的声明会是这样子. C语法 首先,我们谈谈C的语法.C采用了一种 ...

  3. 深入解析JNA—模拟C语言结构体

    原帖:http://blog.csdn.net/shendl/article/details/3599849 深入解析JNA-模拟C语言结构体 前言 前几天写<JNA--JNI终结者>一文 ...

  4. 转发 -- C 语言声明指针的时候 int *p 到底是什么意思?

    C 语言声明指针的时候 int *p 到底是什么意思? https://www.zhihu.com/question/32196190 Mayne解释很不错,谢谢分享,转载如下 Mayne what ...

  5. 解析 TEA 加密算法(C语言、python):

    目录 解析 TEA 加密算法(C语言.python): TEA 加密: XTEA 加密: XXTEA 加密: 解析 TEA 加密算法(C语言.python): TEA系列概述: TEA算法是由剑桥大学 ...

  6. cjson构建_[置顶] cJSON库(构建json与解析json字符串)-c语言

    一.c语言获取json中的数据. 1.先要有cJOSN库,两个文件分别是cJSON.c和cJSON.h. 2.感性认识 char * json = "{ \"json\" ...

  7. 解析 RC4 加密算法(C语言、python)

    目录 解析 RC4 加密算法(C语言.python): RC4加密算法是一种对称加密算法: 加密(解密)原理: RC4算法中的几个关键变量: RC4代码介绍: rc4初始化介绍: 包含三个参数: RC ...

  8. C语言声明数组变量时,在什么情况下,可不指定数组大小

    只有以下三种情况: (1)数组是形式参数 (2)数组声明的同时进行了初始化 (3)数组的存储类型为extern 参考自:<C语言程序设计:现代方法>P334 转载于:https://www ...

  9. c语言声明第一个学生的成绩,C语言课程设计报告--学生成绩管理系统

    <C语言课程设计报告--学生成绩管理系统>由会员分享,可在线阅读,更多相关<C语言课程设计报告--学生成绩管理系统(30页珍藏版)>请在人人文库网上搜索. 1.学生成绩管理系统 ...

最新文章

  1. IBM将收购Instana公司,持续推进其混合云和人工智能战略
  2. 勒索病毒爆发 中国多家校园网发紧急通知提醒防范
  3. 寻找实力高手长期合作
  4. 使用MaxCompute Java SDK 执行任务卡住了,怎么办?
  5. Forth Week :快速上手一门编程语言
  6. Web应用开发技术(1)-html
  7. 有一个包含主函数的java类_重新认识Java中的程序入口即主函数各组成部分
  8. java爬取网页数据_如何使用爬虫工具采集数据
  9. CMMI 项目监督与控制(PMC)
  10. Emmet 文档下载,所有快捷键总结
  11. Combiner合并的使用案例
  12. 京东超市 导航条布局
  13. matlab函数grid,Matlab基本函数-grid、box函数
  14. Linux挂载新硬盘【保姆级教程】
  15. 计算机组成原理——Part Three 性能指标
  16. linux开机启动出现grup,开机出现grub解决方法
  17. javascript基础-抢购器与双色球模拟摇奖器
  18. 百度产品笔试题 答案
  19. 国内主流CMS、SNS、商城等建站系统汇总
  20. 数据挖掘之 数据介绍思维导图

热门文章

  1. Apache Camel SFTP 参数说明及介绍
  2. krpano360全景教程 - 全景场景实现自动旋转及循环浏览全部场景
  3. 笔记本使用vmware
  4. 人工智能是从什么起源的
  5. 统计各销售小组的总销售额
  6. 百家讲坛 大秦崛起(上部)
  7. YTU 3374: H胖胖的健身计划
  8. Burpsuite 抓包
  9. 回文联对联大全_回文联大全,有趣回文对联大全
  10. mac 安装openedx