攀升·Uranus


Something Different,Something New
数据加载中……

C语言怎么解析声明 熟练c/c++(五)

 

         首先声明如果你int (*a)[10], char* const (*next());经了解,就不要看了,一个声明是没什么意思的,这篇文章只是想阐述下C语言是怎么解析它的声明     

         声明里面可以包括的元素有:类型说明符(int, void, char,struct...),存储类型extern, static, register, 类型限定符(const, volatile), 变量名(标识符), 符号(*圆括号和中括号)

       总体原则是,找到标识符(即是我们平时叫的变量名),从右向左解析;

       具体骤如下:

       1. 找到声明中最左边的标识符,去掉标识符   => 变量是叫标识符

       2. 查看标识符右边的下一个符号如果是方括号,取出可能的大小,去掉方括号 >是一个数

    3. 查看标识符右边的下一个符号

 如果是左圆括号,取出可能的参数,一直到右括号 > 是一个函数

       4. 查看标识符左边的符号如果是左括号,找到对应的右括号,并把括号中的声明组合在一起。回到第2步重新开始执行。

       5. 查看标识符左边的符号如果是const, volatile,*, 继续向左读直到不是这三个类型为止重复第4步。  =>释为const, volatile,指向什么的指针

       6. 剩下的符号一并读入 =>static unsigned int

       你可能想问这几步就可以解决了? 是的,这就是所谓的神奇解码环。

    下面我来随便验证下这个算法:

       先来个简单的

int (*a)[10] int* a[10];

   声明式       步骤               执行结果

int (*a)[10]    1步           找到最左边的标识符a,表示a是一个

int (*)[10]      23    不匹配

int (*)[10]      4          匹配(,直接读到),包括*,表示a是一个指向指针.Step2

int [10]          2           匹配[10],表示a是一个指向..size=10的数组的指针

int                 345    不匹配

结束            6           表示a是一个指向int数组的指针

int* a[10]     1           a是一个

int* [10]       2           a是一个…size=10的数组

int*              3           不匹配

int                4           匹配,a是一个存放着指针,size=10的数组

int                5           匹配,a是一个存放着int指针,size=10的数组

       大家的出两个声明的结果是一个是指针,一个是数组。

    int a1[10];

    int a2[20];

    int (*b)[10];

    int* c[10];

    a[0] = 10;

    b = &a2;    //报错,cannot convert from 'int (*)[20]' to 'int (*)[10]'

    b = &a1;    //b是指向size=10的数组的指针

    c[0] = &a1[0]; //c是一个数组,里面存放的是指针,指针指向int;


(未完待续)

posted on 2009-01-08 21:09 攀升 阅读(1572) 评论(0)  编辑 收藏 引用 所属分类: C/C++


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理