VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 2560|回复: 26

[原创] 如何读懂复杂的C语言声明

[复制链接]
79_avatar_middle
在线会员 发表于 2016-2-6 11:07:50 | 显示全部楼层 |阅读模式
C语言中有时会出现复杂的声明,比如

char * const * (*next) (); //这是个什么东东?
在讲复杂声明的分析方法前,先来个补充点。


C语言变量的声明始终贯彻两点:

1.声明和使用的语法尽量保持一致

例如:

复制代码
复制代码
#include <iostream>
using namespace std;

double (*fun)(double);       //声明一个函数指针

int main(){
   fun=sin;
   doube reslut=(*fun)(0.5);//使用这个函数指针
   ...  
}
复制代码
复制代码
2.声明语句不是的阅读不是按照从左往右的阅读顺序,而是要根据各个符号的优先级进行阅读的

这点非常重要!先列出C语言声明的优先级规则,再举个例子就能掌握求解方法了。



C语言声明的优先级规则

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

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

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

    B.2 后缀操作符:

          括号()表示这是一个函数,而

          放括号[]表示这是一个数组;

    B.3 前缀操作符:星号*表示这是一个“指向...的指针”;

C 如果const和(或)volatile关键字的后面紧跟类型说明符(如int,long等),那么它作用于类型说明符。在其他情况下,它作用于关键字左边紧邻的指针星号。



需要强调的一个重要注意点是,对于优先级: () > [] > * 。

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

char * const * (*next) ();
按照规则解读 char * const * (*next) ();

首先,(*next) 表示next是一个指针,它指向某个东东;

根据B.2和最右边的括号,next指向一个函数;

根据B.3,第二个星号表示,该函数返回一个指针;

char * const是函数返回的指针所指向的类型;

char* 是字符指针,const修饰左边的星号,即字符指针是常量的,该指针不可修改(该指针指向的字符内容是可修改的);

综合地表述为,next是一个指针,它指向一个函数,该函数返回一个指针,该指针指向一个类型为char的常量指针。

还是不明白?再往下看就明白了!

#---------------------------------------------------------------------------------#

总结一下,分析复杂的C语言声明,要采用"由内而外,层层剥离”的策略。

从哪里开始剥?从语句的最左边的标志符开始剥(上例为从next开始)。

往哪个方向剥?依照C语言的优先级规则一层层剥。

#---------------------------------------------------------------------------------#

再举一例作详细说明:

char *(* c[10]) (int **p);
第一步,char *(* c[10]) (int **p);  最左边的标志符是c,表示"c是一个什么东东";

第二步,char *(*  [10]) (int **p);  和[10]结合,表示"c是一个长度为10的数组";

第三步,char *(*        ) (int **p);  和*结合,表示"这个数组存放着指针";

第四步,char *             (int **p);  和(int **p)结合,表示"这个指针指向一个函数,函数的参数是二维指针";

第五步,char *                         ;  和 * 结合,表示"这个函数返回一个指针";

第六步,char              ; 这个指针指向一个字符;



把上面六步串起来,读作: c是一个数组[0..9],它存放着指针,指针指向的函数参数是一个二维指针返回值是指向字符的指针。完工!

#---------------------------------------------------------------------------------#

注1: 这个方法若理解了,什么指针数组和数组指针、指针函数和函数指针等等之类的区别都是小菜一碟了。

注2: 合法的声明中存在限制条件。如函数的返回值不能是一个函数,也不能是一个数组,所以像function()()和function()[]是非法的,不能出现。数组里面能存函数指针,但不能存函数,像int (* function[])()是合法的,function[]()则是非法的。

#---------------------------------------------------------------------------------#

评分

参与人数 5驿站币 +7 热心值 +7 收起 理由
65_avatar_small 编程者 + 2 + 2 很给力!
88_avatar_small 寂寞江湖 + 2 + 2 支持原创!
16_avatar_small 阳光 + 1 + 1 支持原创!
28_avatar_small 天下 + 1 + 1 支持原创!
10_avatar_small cmx006 + 1 + 1

查看全部评分





上一篇:C++利用注册表添加桌面右键新建菜单
下一篇:带参数的main函数
10_avatar_middle
在线会员 发表于 2016-2-6 13:24:41 | 显示全部楼层
谢谢分享啊
28_avatar_middle
在线会员 发表于 2016-2-6 13:25:31 | 显示全部楼层
谢谢分享啊
84_avatar_middle
在线会员 发表于 2016-2-6 19:44:09 | 显示全部楼层
谢谢分享
08_avatar_middle
在线会员 发表于 2016-2-6 21:05:24 | 显示全部楼层
如何读懂复杂的C语言声明
17_avatar_middle
在线会员 发表于 2016-2-7 05:36:14 | 显示全部楼层
ghndgcjhgcjhgcgh
22_avatar_middle
在线会员 发表于 2016-2-7 10:43:34 | 显示全部楼层
如何读懂复杂的C语言声明如何读懂复杂的C语言声明如何读懂复杂的C语言声明如何读懂复杂的C语言声明
50_avatar_middle
在线会员 发表于 2016-2-9 17:00:21 | 显示全部楼层
感谢分享,让我来看看。。
47_avatar_middle
在线会员 发表于 2016-2-10 11:26:36 | 显示全部楼层
我进来学习一下
04_avatar_middle
在线会员 发表于 2016-2-12 09:07:46 | 显示全部楼层
正在找这个,谢谢分享!
16_avatar_middle
在线会员 发表于 2016-4-2 16:09:12 | 显示全部楼层

正在学习ing中,
99_avatar_middle
在线会员 发表于 2016-4-3 16:16:58 | 显示全部楼层
i like it
51_avatar_middle
在线会员 发表于 2016-5-6 20:11:23 | 显示全部楼层
谢谢分享
79_avatar_middle
在线会员 发表于 2016-5-31 11:16:35 | 显示全部楼层
学习一下
34_avatar_middle
在线会员 发表于 2016-10-20 18:08:32 | 显示全部楼层
dfsdfsd fsdfsdfsdfsf
30_avatar_middle
在线会员 发表于 2016-12-26 00:16:44 | 显示全部楼层
123456789
32_avatar_middle
在线会员 发表于 2016-12-28 17:39:57 | 显示全部楼层
谢谢分享啊
46_avatar_middle
在线会员 发表于 2016-12-28 20:43:04 | 显示全部楼层
我进来学习一下
78_avatar_middle
在线会员 发表于 2016-12-29 09:29:16 | 显示全部楼层
来学习下先,谢谢
98_avatar_middle
在线会员 发表于 2016-12-29 09:44:28 | 显示全部楼层
谢谢 分享知识
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-5-23 22:15

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表