一个声明:int *p[]

分为四部分:

(1)p

(2)p右面的符号(可以什么都没有)

(3)p左面的符号(可以什么都没有)

(4)最左面的类型说明符

解读一个声明先从p开始,然后的顺序是:右左右左右左右左····

看完了p,然后从p的右边开始看符号(因为优先级高的符号 [ ]和 ( ) 是放在右边的),如果有符号,就和p先结合。

看完右边的符号(如果有的话)后,就决定了p是什么,比如p右面是[],那么p就是数组,如果是(),那么p就是函数,如果什么都没有,那么p就是变量。

这时,就到p左边的符号发挥作用了(左边要么是 * ,要么就什么都没有)。

最后发挥作用是则是类型说明符(int,char,long······)。

实战演示:

int (*p)();

先看p
右面,由于有一个括号把p和*括起来,所以这个声明的最内层是(*p),所以p右面没有东西,那么p就是个变量。
左面,(*p)左面是*,所以p是一个指针变量。
右面,(*p)的右面是一个(),所以p这个指针,指向的是函数。
左面,什么都没有了。
最后是类型符,int,所以,p是一个指针变量,指向函数,函数返回值是int类型。

char (*(*x())[])();

先看x
右面,(),x是一个函数
左面,*,函数返回值类型是指针
右面,[],函数的返回值是指针,该指针指向数组
左面,*,数组内存放的数据是指针
右面,(),数组内的指针指向的是函数(函数指针)
左面,指针指向的函数的返回值是char

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

x
右面,[3],x是一个数组,数组内有三个元素
左面,*,数组内的元素是指针
右面,(),指针指向的函数
左面,*,函数的返回值类型是指针
右面,[5],指针指向的是数组,指向的数组容量是5
左面,char 数组内的元素是char类型

最后说一句,真不知道这样的声明定义出来的东西谁能看懂,我反正是不会用的。

如何解析C语言的声明的更多相关文章

  1. 浅谈C语言变量声明的解析

    C语言本身提供了一种不甚明确的变量声明方式——基于使用的声明,如int *a,本质上是声明了*a的类型为int,所以得到了a的类型为指向int的指针.对于简单类型,这样声明并不会对代码产生多大的阅读障 ...

  2. c语言复杂声明解析

    这是个好东西,接触c语言好几年了,第一次看到这东西,惊喜万分. 先提供个分析案例,以后看方便 vector <int> * (*seq_array[]) (int )={func1,fun ...

  3. C语言复杂声明解读简明方法

    //char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明,关键是搞清楚这个变量是个什么东西(函数.指针.数组), //是函数那么剩下的就是他的参数和返回值, / ...

  4. C语言复杂声明-void (*signal(int sig, void (*handler)(int)))(int);

    问题提出 请分析此声明:void (*signal(int sig, void (*handler)(int)))(int); 求解过程 在对上面的例子作分析之前,我们需要了解C语言的声明优先级,&l ...

  5. 《C专家编程》第三章——分析C语言的声明

    前面一章我们已经说过C语言存在的一些问题和它晦涩的地方,让我们对这门神奇的语言有了更深的了解.现在这一章则集中精力来讨论C语言的声明,分为三块,首先是说明C语言声明晦涩难懂的原因和声明是如何形成的,其 ...

  6. C语言复杂声明

    C语言复杂声明 First step int *f(); /* f:是一个函数,它返回一个指向int类型的指针*/ int (*pf)(); /* pf:是一个指向函数的指针,该函数返回一个int类型 ...

  7. atitit.java解析sql语言解析器解释器的实现

    atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...

  8. C语言字符串声明

    重新学习C语言字符串声明char *a="nihao";char a[]="nihao";什么区别?前者定义的是指针,并且指向字符串常量“nihao”,后者是字 ...

  9. C语言指针声明探秘

    C语言指针声明探秘

随机推荐

  1. 到底创建了几个String对象?

    到底创建了几个String对象? 标签: 堆栈使用 对象创建 分类: 开发技术 关键字: java 面试题 string 创建几个对象 作者:臧圩人(zangweiren) 网址:http://zan ...

  2. XML 和 java对象相互转换

    XML 和 java对象相互转换 博客分类: XML 和 JSON   下面使用的是JDK自带的类,没有引用任何第三方jar包. Unmarshaller 类使客户端应用程序能够将 XML 数据转换为 ...

  3. WEB 集群与负载均衡(一)基本概念-上

    Web集群是由多个同时运行同一个web应用的服务器组成,在外界看来就像一个服务器一样,这多台服务器共同来为客户提供更高性能的服务.集群更标准的定义是:一组相互独立的服务器在网络中表现为单一的系统,并以 ...

  4. [ SSH框架 ] Hibernate框架学习之四(JPA)

    一.JPA概述以及它和Hibernate之间的关系 1.1.Hibernate 概述 JPA Java Persistence API,是EJB3规范中负责对象持久化的应用程序编程接口(ORM接口), ...

  5. 如何实现Zabbix的主动注册功能

    主动注册(Active Agent Auto-Registration),顾名思义,无需在Zabbix Web上手动添加host信息,即可实现主机的监控. 它是由Agent主动向Server注册. 相 ...

  6. PHP实现单例模式和观察者模式

    单例模式的实现: PHP中单例模式常用在数据库连接部分,省掉了大量的new操作进而节省了很多资源.单例模式还可以用在全局配置类中. 单例模式,顾名思义就是说只有一个实例,这就要求防止外部随意实例化对象 ...

  7. webstorm配置eslint【标记错误,修复错误】

    项目中经常用到eslint语法,结合个人经验,用webstorm配置eslint "文件"->"默认设置"->"语言&框架&quo ...

  8. 图片与base64的互转

    /// <summary>        /// 把图片转换到文本信息        /// </summary>        /// <param name=&quo ...

  9. Servlet 单例多线程【转】

    源地址:Servlet 单例多线程 Servlet如何处理多个请求访问?Servlet容器默认是采用单实例多线程的方式处理多个请求的:1.当web服务器启动的时候(或客户端发送请求到服务器时),Ser ...

  10. zlib 压缩输出缓冲区 overflow 问题

    [TOC] 问题 后台服务传包太大时,我们框架可以使用 zlib 库对响应进行压缩:在这次服务调试过程中,使用 zlib compress2 以 Z_BEST_COMPRESSION 模式进行压缩时, ...