美文网首页
分析C语言的声明(2)

分析C语言的声明(2)

作者: Mr_Bluyee | 来源:发表于2018-07-28 21:38 被阅读22次
声明器(declarator)

声明器是所有声明的核心,简单的说,声明器就是标识符以及与它组合在一起的任何指针、函数括号、数组下标等。
表: C语言中的声明器(declarator)

数量 C语言中的名字 C语言中出现的形式
零个或多个 指针 下列形式之一:
*const volatile
*volatile
*
*const
*volatile const
有且只有一个 直接声明器 下列形式之一:
标识符
标识符[下标]
标识符(参数)
(声明器)
零个或一个 初始化内容 = 初始值

一个声明由下表所示的各个部分组成(并非所有的组合形式都是合法的,但这个表描述了我们进一步讨论所用到的词汇)。声明确定了变量的基本类型以及初始值(如果有的话)。
表: C语言中的声明

数量 C语言中的名字 C语言中出现的形式
至少一个类型说明符 类型说明符(type-specifier) void char short int long signed unsigned float double
结构说明符(struct-specifier)
枚举说明符(enum-specifier)
联合说明符(union-specifier)
存储类型(storage-class) extern static register
auto typedef
类型限定符(type-qualifier) const volatile
有且只有一个 声明器(declarator) 参见上表定义
零个或多个 更多的声明器 , 声明器
一个 分号

让我们看一下如果你使用这些部件来构造一个声明,情况能够复杂到什么程度。同时要记住,在合法的声明中存在限制条件。你不可以像下面那样做:

  • 函数的返回值不能是一个函数,所以像foo()()这样是非法的。
  • 函数的返回值不能是一个数组,所以像foo()[]这样是非法的。
  • 数组里不能有函数,所以像foo这样是非法的。
    但像下面这样则是合法的:
  • 函数的返回值允许是一个函数指针,如: int (*foo())()
  • 函数的返回值允许是一个指向数组的指针,如:int (*foo())[]
  • 数组里面允许有函数指针,如 int (* foo[])()
  • 数组里面允许有其他数组,所以你经常能看到int foo[][]
优先级规则

要理解一个声明,必须要懂得其中的优先级规则。

  • A 声明从它的名字开始读取,然后按照优先级顺序依次读取。
  • B 优先级从高到低依次是:
    -------B. 1 声明中被括号括起来的那部分
    -------B. 2 后缀操作符:
    --------------括号()表示这是一个函数,而
    --------------方括号[]表示这是一个数组。
    -------B. 3 前缀操作符:星号*表示“指向...的指针”
  • C 如果const和(或)volatile关键字的后面紧跟类型说明符(如int,long等),那么它作用于类型说明符。在其他情况下,onst和(或)volatile关键字作用于它左边紧邻的指针星号。

用优先级规则分析C语言的一例声明:

char * const *(*next)();
  • A 首先,看变量名“next”,并注意到它直接被括号括住。
  • B. 1 所以先把括号里面的东西作为一个整体,得出“next是一个指向...的指针”。
  • B 然后考虑括号外面的东西,在星号前缀和括号后缀之间作出选择。
  • B. 2 B. 2规则告诉我们优先级较高的是右边的函数括号,所以得出“next是一个函数指针,指向一个返回...的函数”。
  • B. 3 然后,处理前缀“*”,得出指针所指的内容。
  • C 最后,把“char * const”解释为指向字符的常量指针。

把上述分析结果加以概括,这个声明表示“next是一个指针,它指向一个函数,该函数返回另一个指针,该指针指向一个类型为char的常量指针”。

一个更复杂的例子:

char *(* c[10]) (int **p);

1.c
变量名是c
2.c[10]
c是一个有10个元素的数组。
3.(* c[10])
c是一个有10个元素的数组,数组的元素类型是指针,即c是指针数组。
4.(* c[10]) (int **p);
数组的元素指针指向函数,故指针的类型是函数指针。指向的函数接收的形参p为int型的指针的指针类型(二级指针)。
5.*(* c[10]) (int **p);
函数的返回值为一个指针。
6.char *(* c[10]) (int **p);
函数的返回值为一个指向char的指针。

概括的说便是:
c是一个数组[0...9],它的元素类型是函数指针,其所指向的函数的形参p是int型的指针的指针类型,函数的返回值是一个指向char的指针。

相关文章

  • 分析C语言的声明(2)

    声明器(declarator) 声明器是所有声明的核心,简单的说,声明器就是标识符以及与它组合在一起的任何指针、函...

  • 分析C语言的声明(1)

    C语言声明的语法有时会带来严重的问题。C语言声明的语法对于编译器的处理来说并不是什么大不了的事,但是对于一般的程序...

  • 复杂声明 | C语言

    今天看了《C专家编程》里的'分析C语言的声明'一章,终于懂了C语言的复杂声明是怎么解析的。虽然在平时写代码的时候用...

  • C语言类型系统与复杂声明

    Ref: Linuc C编程一站式学习 C语言类型系统 不完全类型 分析复杂声明

  • 从C语言的变量声明到Objective-C中的Block语法

    从C语言的变量声明到Objective-C中的Block语法 从C语言的变量声明到Objective-C中的Blo...

  • 0基础学习C语言第七章:数组(2)

    C语言 多维数组 C 语言支持多维数组。多维数组声明的一般形式如下: type name[size1][size2...

  • 数组-C\Java

    ·C语言:·C语言中的语法:声明、赋值·声明:标示代码格式·赋值:变量获得值的方式变量种类:标量(scalar)、...

  • GeekBand ios 第一周

    一、Objective-C简介 1、由C语言发展而来 2、“时空人”分析法 时间分析-发生在什么时候? 空间分析-...

  • C语言内存分析2

    intmain ( ) { // 一个int类型数据占据4个字节、32bit // 0000 0000 000...

  • cgi文件编译

    c语言的声明语句必须放在开头

网友评论

      本文标题:分析C语言的声明(2)

      本文链接:https://www.haomeiwen.com/subject/hpjamftx.html