当前位置:首页 > 历史趣谈 > 正文内容

C语言左右法则的技巧

C语言左右法则的技巧

C语言左右法则的技巧

C语言左右法则的技巧 第1张

因为C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?以下是小编为大家搜索整理的C语言左右法则的技巧,欢迎大家阅读!更多精彩内容请及时关注我们应届毕业生考试网!

右左法则是一个既着名又常用的方法。不过C语言左右法则的技巧,右左法则其实并不是C标准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何辩识一个声明的,两者可以说是相反的。右左法则的英文原文是这样说的:

The right-left rule: Start the from the , go right, and then go left. When you

, the be . Once in the has been

, jump out of it. till the whole has been .

这段英文的翻译如下:

右左法则:首先从最里面的圆括号看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。

笔者要对这个法则进行一个小小的修正,应该是从未定义的标识符开始阅读,而不是从括号读起,之所以是未定义的标识符,是因为一个声明里面可能有多个标识符,但未定义的标识符只会有一个。

现在通过一些例子来讨论右左法则的应用,先从最简单的开始,逐步加深:

int (*func)(int *p);

首先找到那个未定义的标识符,就是func,它的外面有一对圆括号,而且左边是一个*号,这说明func是一个指针,然后跳出这个圆括号,先看

右边,也是一个圆括号,这说明(*func)是一个函数,而func是一个指向这类函数的指针,就是一个函数指针,这类函数具有int*类型的形参,返回值类型是 int。

int (*func)(int *p, int (*f)(int*));

func被一对括号包含,且左边有一个*号c语言右结合性,说明func是一个指针,跳出括号,右边也有个括号,那么func是一个指向函数的指针,这类函数具有int *和int (*)(int*)这样的形参,返回值为int类型。再来看一看func的形参int (*f)(int*),类似前面的解释,f也是一个函数指针,指向的函数具有int*类型的形参,返回值为int。

int (*func)(int *p);

func右边是一个运算符,说明func是一个具有5个元素的数组,func的左边有一个*,说明func的元素是指针,要注意这里的*不是修饰 func的,而是修饰func的,原因是运算符优先级比*高,func先跟结合,因此*修饰的是func。跳出这个括号,看右边,也是一对圆括号,说明func数组的元素是函数类型的指针,它所指向的函数具有int*类型的形参,返回值类型为int。

int (*(*func))(int *p);

func被一个圆括号包含,左边又有一个*,那么func是一个指针,跳出括号,右边是一个运算符号c语言右结合性,说明func是一个指向数组的指针,现在往左看,左边有一个*号,说明这个数组的元素是指针,再跳出括号,右边又有一个括号,说明这个数组的元素是指向函数的指针。总结一下,就是:func是一个指向数组的指针,这个数组的元素是函数指针,这些指针指向具有int*形参,返回值为int类型的函数。

int (*(*func)(int *p));

func是一个函数指针,这类函数具有int*类型的形参,返回值是指向数组的指针,所指向的数组的元素是具有5个int元素的数组。

要注意有些复杂指针声明是非法的,例如:

int func(void) ;

func是一个返回值为具有5个int元素的数组的函数。但C语言的函数返回值不能为数组,这是因为如果允许函数返回值为数组,那么接收这个数组的内容的东西,也必须是一个数组,但C语言的数组名是一个右值,它不能作为左值来接收另一个数组,因此函数返回值不能为数组。

int func(void);

func是一个具有5个元素的数组c语言右结合性,这个数组的元素都是函数。这也是非法的,因为数组的元素除了类型必须一样外,每个元素所占用的内存空间也必须相同,显然函数是无法达到这个要求的,即使函数的类型一样,但函数所占用的空间通常是不相同的。

作为练习,下面列几个复杂指针声明给读者自己来解析。

int (*(*func));

int (*(*(*func)(int *)))(int *);

int (*(*func)(int*));

实际当中,需要声明一个复杂指针时,如果把整个声明写成上面所示的形式,对程序可读性是一大损害。应该用来对声明逐层

分解,增强可读性,例如对于声明:

int (*(*func)(int *p));

可以这样分解:

int (*PARA);

PARA (*func)(int *);

这样就容易看得多了。

答案C语言左右法则的技巧,同时给出用的分解方法:

int (*(*func));

func是一个指向数组的指针,这类数组的元素是一个具有5X6个int元素的二维数组,而这个二维数组的元素又是一个二维数组。

int (*PARA);

PARA (*func);

int (*(*(*func)(int *)))(int *);

func是一个函数指针,这类函数的返回值是一个指向数组的指针,所指向数组的元素也是函数指针,指向的函数具有int*形参,返回值为int。

int (*PARA1)(int*);

PARA1 (*PARA2);

PARA2 (*func)(int*);

int (*(*func)(int*));

func是一个数组,这个数组的元素是函数指针,这类函数具有int*的形参,返回值是指向数组的指针,所指向的数组的元素是具有5个int元素

的数组。

int (*PARA1);

PARA1 (*PARA2)(int*);

PARA2 func;

加入微信交流群:************ ,请猛戳这里→点击入群

扫描二维码推送至手机访问。

版权声明:本文由多彩生活知识库发布,如需转载请注明出处。

本文链接:https://www.dczhishi.com/post/4040.html

分享给朋友:

“C语言左右法则的技巧” 的相关文章

小年祭灶王,传统习俗中的祈愿与祝福

小年祭灶王,传统习俗中的祈愿与祝福

小年,作为中国传统节日中的一个重要节点,承载着丰富的文化内涵和人们对美好生活的祈愿与祝福。在这一天,祭灶王的习俗尤为引人注目,它不仅是一种古老的仪式,更是人们内心深处对家庭、对未来的深深寄托。祭灶王的历史可以追溯到古代,相传灶王是玉皇大帝派往人间的监察官,负责记录人间善恶之事。每年的小年,人们都会举...

清明吃青团习俗,软糯美食中的春之记忆

清明吃青团习俗,软糯美食中的春之记忆

清明,是一个承载着深厚文化底蕴的节气,在这个时节,除了扫墓祭祖等传统活动外,吃青团的习俗也悄然兴起,成为了春天里一道独特的风景线。青团,那一抹翠绿,仿佛是春天的使者,带着大自然的气息,悄然绽放在人们的餐桌上。它以糯米粉为皮,内馅则丰富多样,有豆沙的香甜、芝麻的醇香、蛋黄的咸香等,每一口都能品尝到春天...

七夕拜织女习俗,女子间的私密仪式

七夕拜织女习俗,女子间的私密仪式

七夕,这个充满浪漫与神秘色彩的节日,承载着千年的文化传承。其中,拜织女习俗作为女子间的私密仪式,更是展现了古代女子的心灵世界与情感寄托。在七夕的夜晚,皓月当空,繁星闪烁。女子们纷纷聚集在庭院或闺房中,准备进行拜织女的仪式。她们精心挑选出最漂亮的衣物,穿上那身象征着纯洁与美好的服饰,仿佛瞬间化身为天上...

小年吃灶糖习俗,甜蜜话语祈愿灶神

小年吃灶糖习俗,甜蜜话语祈愿灶神

小年,作为中国传统节日中的一个重要节点,承载着丰富的文化内涵和人们对美好生活的向往。在这一天,吃灶糖的习俗尤为盛行,那甜甜的灶糖,不仅是味蕾的享受,更是人们对灶神的一份甜蜜祈愿。灶糖,形状各异,有长条形的、圆形的,还有菱形的等,外表裹着一层晶莹剔透的糖衣,散发着浓郁的麦芽糖香气。传说中,灶神每年都会...

清明斗鸡习俗,传统娱乐的别样风采

清明斗鸡习俗,传统娱乐的别样风采

清明时节,除了扫墓祭祖、踏青郊游等传统活动外,还有一项别具特色的习俗——斗鸡。斗鸡,作为一种古老的传统娱乐活动,承载着深厚的历史文化底蕴,展现出别样的风采。斗鸡的历史可以追溯到先秦时期,当时它就已成为贵族们喜爱的娱乐项目。在漫长的岁月里,斗鸡历经了无数次的传承与发展,逐渐融入了民间,成为广大民众喜爱...

中秋节偷葱偷菜习俗,别样的节日乐趣

中秋节偷葱偷菜习俗,别样的节日乐趣

中秋节,是我国传统的重要节日之一,除了赏月、吃月饼等常见的习俗外,在一些地方还流传着偷葱偷菜的独特习俗,这为中秋佳节增添了一份别样的乐趣。偷葱偷菜这一习俗往往与祈求姻缘和生育相关。在中秋之夜,人们会趁着夜色悄悄溜到别人家的菜园或葱地,偷偷摘取几根葱或几把菜。据说,偷到葱的人将会在未来的生活中聪明伶俐...