如何解析C语言的声明
一个声明: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语言的声明的更多相关文章
- 浅谈C语言变量声明的解析
C语言本身提供了一种不甚明确的变量声明方式——基于使用的声明,如int *a,本质上是声明了*a的类型为int,所以得到了a的类型为指向int的指针.对于简单类型,这样声明并不会对代码产生多大的阅读障 ...
- c语言复杂声明解析
这是个好东西,接触c语言好几年了,第一次看到这东西,惊喜万分. 先提供个分析案例,以后看方便 vector <int> * (*seq_array[]) (int )={func1,fun ...
- C语言复杂声明解读简明方法
//char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明,关键是搞清楚这个变量是个什么东西(函数.指针.数组), //是函数那么剩下的就是他的参数和返回值, / ...
- C语言复杂声明-void (*signal(int sig, void (*handler)(int)))(int);
问题提出 请分析此声明:void (*signal(int sig, void (*handler)(int)))(int); 求解过程 在对上面的例子作分析之前,我们需要了解C语言的声明优先级,&l ...
- 《C专家编程》第三章——分析C语言的声明
前面一章我们已经说过C语言存在的一些问题和它晦涩的地方,让我们对这门神奇的语言有了更深的了解.现在这一章则集中精力来讨论C语言的声明,分为三块,首先是说明C语言声明晦涩难懂的原因和声明是如何形成的,其 ...
- C语言复杂声明
C语言复杂声明 First step int *f(); /* f:是一个函数,它返回一个指向int类型的指针*/ int (*pf)(); /* pf:是一个指向函数的指针,该函数返回一个int类型 ...
- atitit.java解析sql语言解析器解释器的实现
atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...
- C语言字符串声明
重新学习C语言字符串声明char *a="nihao";char a[]="nihao";什么区别?前者定义的是指针,并且指向字符串常量“nihao”,后者是字 ...
- C语言指针声明探秘
C语言指针声明探秘
随机推荐
- 导入项目 idea
下的java核心编程的源码,只有java文件,没有idea或者eclipse的项目结构信息. 分别用eclipse和idea打开了一遍,方便学习调试. 项目文件夹:E:\学习资料\Java\语法\ja ...
- Ubuntu 16.04开启SSH服务
安装: sudo apt-get install openssh-server 启动: sudo service ssh start 查询服务启动状态: sudo ps -e | grep ssh 或 ...
- 正确截取List指定位置的内容
正确截取List指定位置的内容 import java.util.ArrayList; import java.util.List; public class ListUtils { public s ...
- Java面试题全集(上-中-下)及Java面试题集(1-50/51-70)
阅读量超百万级的文章,收藏并分享一下.感谢原创作者的总结 对初中级java开发人员有特别大的帮助,不论是技术点面试还是知识点总结上. Java面试题全集(上): https://blog.cs ...
- 测试驱动开发 TDD
一.详解TDD 1.1.TDD概念 :Test Drived Develop 测试驱动开发是敏捷开发中的一项核心实践和技术,也是一种方法论.TDD的原理是在开发功能代码之前,编写单元测试用例代码,测试 ...
- 使用ssh keys实现免验证登陆远程服务
使用ssh keys实现免验证登陆远程服务========================Created 星期四 10 五月 2018 引言------------------程序员或者服务器运维人员 ...
- Java单例模式(Singleton)以及实现
一. 什么是单例模式 因程序需要,有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计. 二. 单例模式的特点 1. 单例模式只能有一个实例. 2. 单例类必须创建 ...
- Lua读取CSV文件到table中
创建Lua函数载入CSV文件并保存到表中的函数: function GetLines(fileName) indx = 0 myLines ={} for line in io.line(string ...
- Linux 下 Redis 安装与配置
1.Redis 的安装 在 Ubuntu 系统安装 redis 可以使用以下命令: $ sudo apt-get update $ sudo apt-get install redis-server ...
- linux基础-系统安装教程篇(centos6.5)
一.linux系统简介: Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件.应用程 ...