Sunday, October 10, 2010

c专家编程-分析c语言的声明

本章主要说明声明如何构成,如何去解读声明,以及哪些声明是非法的,包括对typedef的详解

1. 声明合法与否
a. 函数的返回值不能是一个函数,如f()(),可以是函数指针,如int(* fun())();
b. 函数的返回值不能是一个数组,如f()[],可以是指向数组的指针,如int(*foo())[];
c. 数组里面不能有函数,如a[](),数组里面可以有函数指针,如int(* a[])(),可以有其他数组,如
int a[][]

2. c语言声明的优先级规则
        A 声明从它的名字开始读取,然后按照优先级顺序依次读取;

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

            B.1 声明中被括号括起来的那部分;

            B.2 后缀操作符:括号()表示这是一个函数,而方括号[]表示这是一个数组;

            B.3 前缀操作符:星号*标识“指向……的指针”;

        C 如果const和(或者)volatile关键字的后面紧跟类型说明符(如int,long等),那么它作用于类型说明符,在其他情况下,const和(或)volatile关键字作用于它左边紧邻的指针星号。
举例说明:char * const * (*next)();
        A      next                ——next为声明的名字

        B.1 (*next)              ——next为一个指向……的指针

        B.2 (*next)()          ——next是一个函数指针

        B.3 *(*next)()         ——next是一个函数指针,这个函数返回一个指向……的指针

        C    char * const     ——指向字符类型的常量指针
故 char * const *(*next)();的含义就是: next是一个函数指针,这个函数返回一个指向字符类型的常量指针

3. 图示解析c语言的声明
 此图也是一种解析c声明的方法,不过2中的ABC的方式更加简单明了

1 comment: