`
omygege
  • 浏览: 1354758 次
文章分类
社区版块
存档分类
最新评论

深入解析C语言声明

 
阅读更多

如果说C语言声明很简单的人不是牛人就是还没入门。本文来讲解C语言的声明的一些基本内容,很多内容参考《c专家编程》。首先由一个最简单的问题引入,你知道 int * p[5] 和 int (*p)[5] 的区别在哪里吗?把后面的答案遮到,想想。也许你知道反正一个是含有五个指向整型的指针元素的指针数组,另一个是指向一个拥有5个整型元素的数组的指针,具体呢?

int *p[5]是一个含有五个整型指针的数组,int(*p)[5]是一个指向5个整型元素的数组指针。如果你能分清楚,恭喜你,你起码是入门级以上的水平。那这个呢, char * const *(*next)()?

如果你能把上面这句声明清清楚楚明明白白的说出来,下面你不用看了,下面的东西对你来说都是废话。

首先我们需要理解C语言的声明的优先级规则,如下:

A 声明从它的名字开始读取,然后按照优先级顺序来依次读取。

B 优先级从高到底依次是:

B.1 生命中被括号括起来的那部分

B.2 后缀操作符

括号()表示这是一个函数,而方括号[]表示这是一个数组

B.3 前缀操作符: 星号*表示 指向...的指针

C 如果const在指针星号前他作用于指针指向的变量,如果const在指针星号后他作用于指针

另一种说法是,const修饰的是它前面的类型,如果它前面没有类型则修饰的是紧跟其后的类型

如 const int * a; int const * a; int * const a;前两个const在*之前,指针所指向的变量是只读,最后一个是指针本身只读。

我们开始解析上面的声明

适用规则 解释

A 首先,看变量名"next",并注意到它直接被括号所括住

B.1 所以先把括号里面的东西作为一个整体,得出"next是一个指向...的指针"

B 然后考虑括号外面的东西,在星号前缀和括号后缀之间做出选择

B.2 规则告诉我们优先级较高的是右边的函数括号,所以得出"next是一个函数指针,指向一个返回...的函数"

B.3 然后,处理前缀"*",得出指针所指的内容

C 最后,把"char * const"解释为指向字符的常量指针

所以综上所述,这个式子的真正的含义是:next是一个指针,它指向一个函数,该函数返回另一个指针,该指针指向一个类型为char的常量指针。

其实理解这个最基本的优先级是需要理解的运算符的优先级:如下顺序

操作符 结合性

() [] -> . 左到右

! - ++ -- + - * & sizeof 右到左

* / % 左到右

+ - 左到右

<< >> 左到右

< <= > >= 左到右

== != 左到右

& 左到右

^ 左到右

| 左到右

&& 左到右

|| 左到右

?: 右到左

= += -= *= /= %= ^= |= <<= >>= 到左

, 左到右

分享到:
评论

相关推荐

    深入解析C语言中typedef的四个用途

    可以用作同时声明指针型的多个对象。比如:char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, 和一个字符变量;以下则可行:typedef char* PCHAR; // 一般用大写PCHAR pa, pb; // 可行...

    深入解析C语言中函数指针的定义与使用

    1.函数指针的定义   函数是由执行语句组成的指令序列或者代码,这些代码的有序集合根据其大小被分配到一定的内存空间中,这一片内存空间的起始地址就成为函数的地址,不同的函数有不同的函数地址,编译器通过函数...

    C语言解析教程(原书第4版)(美) 凯利.pdf

    《c语言教程(原书第4版)》是一本优秀的c程序设计语言教材,完整描述了ansi c语言及其语法特性,并对c语言的高级特性和应用作了深入阐述,介绍了从c到c++和java过渡的相关知识。《c语言教程(原书第4版)》的一个...

    C语言typedef与复杂函数声明问题的深入解析

    以下是对C语言中的typedef与复杂函数声明问题进行了详细的分析介绍,需要的朋友可以过来参考下

    你必须知道的495个C语言问题.pdf

    作者在网络版CFAQ列表的基础上进行了大幅度的扩充和丰富,结合代码示例,权威而且详细深入地解答了实际学习和工作中最常遇到的495个C语言问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等...

    Java编写的一个类C语言编译器(词法分析,语法分析,语义分析和目标代码生成).zip

    - 使用Java的递归下降解析器或LL(1)解析器实现语法分析器,能够将词法单元序列转换为抽象语法树(AST)。 - 处理语法错误,如语法错误和类型错误。 3. **语义分析器**: - 遍历抽象语法树,执行语义检查。 - ...

    深入理解C++11新特性解析与应用

    《深入理解C++11:C++11新特性解析与应用》一共8章:第1章从设计思维和应用范畴两个维度对C++11新标准中的所有特性进行了分类,呈现了C++11新特性的原貌;第2章讲解了在保证与C语言和旧版C++标准充分兼容的原则下增加...

    深入解析C++中的引用类型

    在c++中狭义的对象指的是用类,结构,联合等复杂数据类型来声明的变量,如 MyClass myclass,CDialog mydlg,等等。广义的对象还包括用int,char,float等简单类型声明的变量,如int a,char b等等。我在下文提到...

    内联函数inline与宏定义深入解析

    内联函数的优越性:一:inline定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换(像...说明:类A的成员函数readTest()和setTest()都是内联函数,readTest()函数的定义体被放在类声明之中,因

    深入理解C++11:C++11新特性解析与应用

    《深入理解C++11:C++11新特性解析与应用》免责声明序前言第1章 新标准的诞生 11.1 曙光:C++11标准的诞生 11.1.1 C++11/C++0x(以及C11/C1x)—新标准诞生 11.1.2 什么是C++11/C++0x 21.1.3 新C++语言的设计目标 ...

    基于PLY实现词法,语法分析器,进而实现语义分析.zip

    使用PLY,可以创建能够解析复杂文本和编程语言的程序。在实现词法分析和语法分析之后,可以进一步进行语义分析,从而对源代码的语义进行检查和操作。 ### 项目介绍: **目标**:使用PLY库实现一个C语言的词法分析器...

    关于第九届蓝桥杯单片机省赛程序题

    针对这一赛事,不少网络平台和社区分享了参赛者的编程心得、源代码解析及调试经验,提供了丰富的参考资料和技术讨论,有助于参赛者深入理解并优化其程序设计。在实际操作中,参赛者需要综合运用C语言编程技巧,结合...

    寒江独钓-Windows内核安全编程(高清完整版).part1

    阅读本书,需要读者有C语言、数据结构、操作系统和计算机网络的基础知识。 目录: 封面 -25 扉页 -24 内容简介 -23 序 -22 关于本书作者和贡献者 -20 前言 -18 阅读注意 -16 目录 -12 正文 1 第1章 内核上机指导 1...

    寒江独钓-Windows内核安全编程(高清完整版).part7

    阅读本书,需要读者有C语言、数据结构、操作系统和计算机网络的基础知识。 目录: 封面 -25 扉页 -24 内容简介 -23 序 -22 关于本书作者和贡献者 -20 前言 -18 阅读注意 -16 目录 -12 正文 1 第1章 内核上机指导 1...

Global site tag (gtag.js) - Google Analytics