C语言右左法则----复杂指针解析

C语言右左法则----复杂指针解析

ID:41560417

大小:54.65 KB

页数:3页

时间:2019-08-27

C语言右左法则----复杂指针解析_第1页
C语言右左法则----复杂指针解析_第2页
C语言右左法则----复杂指针解析_第3页
资源描述:

《C语言右左法则----复杂指针解析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、C语言右左法则■一■复杂指针解析核心提示:因为C语言所冇复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既着名乂常用的方法因为C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既着名乂常用的方法。不过,右左法则其实并不是c标准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何辩识一个声明的,两者可以说是相反的。右左法则的英文原文是这样说的:Theright—leftrule:Startreadingthedeclarationfromthe

2、innermostparentheses,goright,andthengoleft.Whenyouencounterparentheses,thedirectionshouldbereversed.Onceeverythingintheparentheseshasbeenparsed,jumpoutofit.Continuetillthewholedeclarationhasbeenparsed.这段英文的翻译如下:右左法则:首先从最里而的圆括号看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声

3、明解析完毕。笔者要对这个法则进行一个小小的修正,应该是从未定义的标识符开始阅读,而不是从括号读起,Z所以是未定义的标识符,是因为一个声明里面可能有多个标识符,但未定义的标识符只会有一个。现在通过一些例子来讨论右左法则的应用,先从最简单的开始,逐步加深:int(*func)(int*p);首先找到那个未定义的标识符,就是func,它的外面有一对圆括号,而且左边是一个*号,这说Wfunc是一个指针,然后跳出这个圆括号,先看右边,也是一个圆括号,这说明(*func)是一•个函数,而func是一个指向这类函数的指针,就是一个函数指针,这类函数具有int*类型的形参,返冋值类型是intoi

4、nt(*func)(int*p,int(*f)(int*));ftmc被一对括号包含,且左边有一个*号,说明feme是一个指针,跳出括号,右边也有个括号,那么func是一个指向函数的指针,这类函数具有int*和int(*)(int*)这样的形参,返冋值为int类型。再來看一看func的形参int(*f)(int*),类似前面的解释,f也是一个函数指针,指向的函数具有int*类型的形参,返回值为51。int(*func[5])(int*p);func右边是一个[]运算符,说明func是一个具冇5个元素的数组,func的左边冇一个*,说明func的元素是指针,要注意这里的*不是修饰f

5、unc的,而是修饰func[5]的,原因是□运算符优先级比*高,func先跟口结合,因此*修饰的是func[5]o跳出这个括号,看右边,也是一对圆括号,说明func数组的元素是函数类型的指针,它所指向的函数具冇int*类型的形参,返回值类型为int。int(*(*func)[5])(int*p);func被一个圆括•号包含,左边又有一个*,那么func是一个指针,跳出括号,右边是一个□运算符号,说明func是一个指向数组的指针,现在往左看,左边有一个*号,说明这个数组的元素是指针,再跳出括号,右边又有一个括号,说叨这个数组的元素是指向函数的指针。总结一下,就是:func是一个指向

6、数组的指针,这个数组的元素是函数指针,这些指针指向具有int*形参,返回值为int类型的函数。int(*(*func)(int*p))[5];func是一个函数指针,这类函数具有int*类型的形参,返回值是指向数组的指针,所指向的数组的元素是具有5个int元素的数组。要注意有些复杂指针声明是非法的,例如:intfunc(void)[5];func是一个返凹值为具有5个int元素的数组的函数。但C语言的函数返回值不能为数组,这是因为如果允许函数返1叫值为数组,那么接收这个数组的内容的东西,也必须是一个数组,但C语言的数组名是一个右值,它不能作为左值来接收另一个数组,因此函数返冋值不

7、能为数组。intfunc[5](void);func是一个具有5个元素的数纟R,这个数纟fl的元素都是函数。这也是非法的,因为数组的元素除了类型必须一样外,每个元素所占•用的内存空间也必须相同,显然函数是无法达到这个要求的,即使函数的类型一样,但函数所占用的空间通常是不相同的。作为练习,卜•而列几个复杂指针芦明给读者口己来解析。int(*(*func)[5][6])[7][8];int(*(*(*func)(int*))[5])(int*);int(*(*func[7][8]⑼)

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。