当前位置:首页 >> 部位养生

水滴石穿语言之声明的语法呢

2021-09-06 09:57 来源:莱西养生网

概述   在很多情况下,尤其是读别人所写代码的时候,对C语言声明的理解能力变得非常重要,而C语言本身的凝练简约也使得C语言的声明常常会令人感到非常困惑,因此,在这里我用一篇的内容来集中阐述一下这个问题。

问题:声明与函数

有一段程序存储在起始地址为0的一段内存上,如果我们想要调用这段程序,请问该如何去做?

答案

答案是(*(void (*)( ) )0)( )。看起来确实令人头大,那好,让我们知难而上,从两个不同的途径来详细分析这个问题。

答案分析:从尾到头

首先,最基本的函数声明:void function (paramList);

最基本的函数调用:function(paramList);

鉴于问题中的函数没有参数,函数调用可简化为 function();

其次,根据问题描述,可以知道0是这个函数的入口地址,也就是说,0是一个函数的指针。使用函数指针的函数声明形式是:void (*pFunction)(),相应的调用形式是: (*pFunction)(),则问题中的函数调用可以写作:(*0)( )。

第三,大家知道,函数指针变量不能是一个常数,因此上式中的0必须要被转化为函数指针。

我们先来研究一下,对于使用函数指针的函数:比如void (*pFunction)( ),函数指针变量的原型是什么? 这个问题很简单,pFunction函数指针原型是( void (*)( ) ),即去掉变量名,清晰起见,整个加上()号。

所以将0强制转换为一个返回值为void,参数为空的函数指针如下:( void (*)( ) )。

OK,结合2)和3)的分析,结果出来了,那就是:(*(void (*)( ) )0)( ) 。

答案分析:从头到尾理解答案

方法11.数据库推广 (void (*)( )) ,是一个返回值为void,参数为空的函数指针原型。

(void (*)( ))0,把0转变成一个返回值为void,参数为空的函数指针,指针指向的地址为0.

*(void (*)( ))0,前面加上*表示整个是一个返回值为void的函数的名字

(*(void (*)( ))0)( ),这当然就是一个函数了。

我们可以使用typedef清晰声明如下:

typedef void (*pFun)( );

这样函数变为 (*(pFun)0 )( );

问题:三个声明的分析

对声明进行分析,最根本的方法还是类比替换法,从那些最基本的声明上进行类比,简化,从而进行理解,下面通过分析三个例子,来具体阐述如何使用这种方法。

#1:int* (*a[5])(int, char*);

首先看到标识符名a,“[]”优先级大于“*”,a与“[5]”先结合。所以a是一个数组,这个数组有5个元素,每一个元素都是一个指针,指针指向“(int, char*)”,很明显,指向的是一个函数,这个函数参数是“int, char*”,返回值是“int*”。OK,结束了一个。:)

#2:void (*b[10]) (void (*)());

b是一个数组,这个数组有10个元素,每一个元素都是一个指针,指针指向一个函数,函数参数是“void (*)()”【注10】,返回值是“void”。完毕!

注意:这个参数又是一个指针,指向一个函数,函数参数为空,返回值是“void”。

#3. doube(*)() (*pa)[9];

pa是一个指针,指针指向一个数组,这个数组有9个元素,每一个元素都是“doube(*)()”(也即一个函数指针,指向一个函数,这个函数的参数为空,返回值是“double”)。

龙岩哪里有白癜风医院
昆明治疗白癜风去哪里
乌鲁木齐医院妇科哪好
相关阅读
大白熊犬嘴边长了很多红包没事吧位置

大白熊犬嘴边长了一个红包包,是什么情况,求解答张牙舞爪:觉得买狗有点像皮肤病一看就知道是大白熊犬的嘴,跟我家的嘴巴很像嘴边又不能擦药,我觉得你还是去宠物医院征求下医生的意见吧如果别的地方都...

大白熊犬吸收不好吃的多不长个怎么回事位置

我家大白熊犬7个月大了,吸收一直不是很好, 一个月来只长了可怜的一斤肉,但是平时吃得也不少,每天2顿鱼子酱的狗粮,蛋黄,牛肉都吃的,还有发育宝钙片什么的补品,就是不吸收呀,宠物狗大便么一天次,...

大白熊犬吃骨头后开始干呕如何是好位置

昨晚大白熊犬吃了骨头 ,晚上躺着睡觉就开始肚子不是正常的呼吸那个样子,站起来就干呕 ,肚子一抽一抽的,是怎么回事啊丁香花:四个月的大白熊犬价格胃肠功能较弱,建议只吃狗粮。根据您的描述,有理由...

大白熊犬可以吃鸡蛋吗位置

导读:大白熊犬可以吃鸡蛋吗,鸡蛋富含多种氨基酸,是动物蛋白的较好的来源。大家都知道鸡蛋是营养丰富的美味食物,很多人都喜欢吃鸡蛋,我们饲养的大白熊狗狗也喜欢哦,可能有些谨慎的爱狗人士会问?鸡...

大白熊犬发情特征交配需要注意的事项位置

大白熊犬发情特征,当家里养的大白熊犬开始学会抱着主人的腿或者遛狗的时候发现自己狗狗会抱着别的狗狗的时候,有些饲主就误以为家里的狗狗发情了,其实并不然,这只是宣誓 的一种举动,那么大白熊犬真...

大白熊犬为什么会突然间浑身抽搐位置

我家养了只大白熊犬,昨天把狗窝拉塌了,我上去后,它就在地上浑身抽搐。一分钟后停了,但是起来晕忽忽的,走不成路,好象精神恍惚。几分钟就好了,没在意,今天中午又开始抽搐,大白熊犬到晚上抽搐了4...

友情链接