C语言大世界—————函数指针下
2014-12-13 17:38
351 查看
/****************************************************************** @brief:检讨下 前面几篇博文质量不是很高 ,不忍直视... 不过内容改讲的都讲了,代码也都能执行,我反复看 了几遍,感觉自己废话连篇,点子是讲到了,可让人 看着心烦。作为一个工科男,毕竟文笔三流。今天 主要探讨上次遗留的问题,由于出差几天以及项目 加急,一直没更新,另外点击量也不高,动力不足了。 尽管如此,我觉得坚持就是胜利,一句话开搞! ******************************************************************/ #include "stdio.h" int main() { #if 0 例子是编程专家例子,只要你看过先前我的文章,理解起来没有问题。 char * const *(*next)(); 在解释之前,来个口诀,千万不要背...看完之后咱按照例子往死里扒。 1.抓关键 > 找到next,凡事要抓关键、抓重点。这里就是'next'。也叫标识符! 2.右盼 > 右盼两个东西,首先考虑方括号('[]'),其次是左括号('(',注意 是左括号哦,假如有,再找到对应的右括号)。方括号表示一个数组, 例如a[];左括号嘛,像'a()',函数的调用,写的复杂点就是'a(para1,para2)', 这个函数是有参数传入的。 3.四次'左看'而结合 前有大禹三过家门而不入,后又四次'左看'来结合,结合之后可以当做 一个'新的对象',一个'新的标识符',用引号只是假象罢了。方便说明 > 1.左看左括号('('),假如有,找到对应的右括号,开心返回第二步右盼从上往下执行 > 2.左看符号const,有就结合。 继续执行下一步 找volatile > 3.左看符号volatile,有就结合。 继续执行下一步 找 '*' > 4.左看符号'*',有就结合。 '*'既是一个开始 又是一个结束。她将再次回到四次左看 从上至下执行,既从找左括号开始.假如一轮左看结束没找到东西 不好意思 结束了! 进入下面的善始善终。 4.做事要善始善终 > 剩下的符号只不过是一个声明的基本类型。一并收留吧,I know you are a good person!....(别想歪) 总结:以上是一个完整的分析流程,很是简单。下面给出几个例子来: example01: char * const *(*next)(); example02: void (*signal)(int sig,void(*func)(int)))(int); 希望第二个例子没有把你吓到,假如的讲解让你还是无法理解,请联系我! #endif #if 0 example01: char * const *(*next)(); 1.抓关键 抓重点 > next 这个标识符太好找了 2.右盼 > 两个东西('[]'与'(',关于符号'[]'我觉得大家都不会搞错,就怕'(' 会让某些同志看错,首先是找左括号,然后找对应的右括号结合,其次 强调我们的左顾右盼都是相邻的,假如你要说"(*next)()",直接从next 与 后面()结合,先说*不答应,右括号')'也不答应啊)。 回归正题,很遗憾,右盼啥都没盼到.跳过吧 3.四次左看 > 1.左括号'('木有, const 没有,volatile 没有,'*'有! 结合之后是------> *next 这是一个指针....啥类型还不知道! 现在要进行哪一步还记得吗?应该是回到四次左看最开始!老老实实 从左括号开始找起'(' 假如不记得在回上文看看! 5.四次左看 > 左括号'('有木有!结合之后是----->(*next) next 是一个指针.. 现在应该进行哪一步?要知道'('与 const,volatile,*这一类与众不同,它 返回层次高,回到右盼,而后面3个小伙子是返回四次左看最开始,又从左 括号找起 6.右盼 > 木有[],但是有左括号啊 然后一路追踪到对应的右括号,结合之后是这样的 ----->(*next)(), 这个有点像函数了,看过前文的同志,应该知道啦!next 指向什么不言而 喻。指向函数的指针。有点眉目了!函数返回什么貌似没说! 7.右盼执行完毕又到四次左看 > 找左括号没有,找const没有,找volatile没有,'*'有! 结合之后是这样的 -------> *(*next)() 这个.... 别慌!镇定!看上 面,我们还不知道这个函数返回什么呢? 没错!*就是返回的东西!是一个 指针。举个例子int* add();这个函数是返回一个指向int 类型的指针! 嗯...原来如此。上面那东西看似吓人,实则简单。最后我们是这么理解: next 首先是一个函数指针,作为一个函数,就算没有返回值,起码写个void。 而我们这里是返回一个指针。(*next)你可以当做add 函数名.貌似还不知道 这个返回指针到底指向什么.....好了,形势一片大好,现在回到哪一步? YES !是返回四次左看,然后从上到下执行。 8 四次左看 > 左括号木有 找const ,有了! 刚说函数返回一个指针,指针指向什么类型 却不知道.这里不就有点眉目了吗? const 是一个"只读"形容词,和*靠那么近。 那么这个指针就是...停 stop! 我知道你要说什么。const 可不是形容指针(函数返回的那个指针) '*'表示什么? 表示指针指向啥啥东西,而const 就是来形容这个啥啥啥东西 是只读的!不过这个指针返回什么类型还是不知道... 唯一确定的是那东西是只读。 现在该怎么办? 执行下去呗 查找volatile没有 找'*'有 结合起来是这样的-----> * const *(*next)() 哦?又指向了一个'*' ,尼玛 牛逼。函数返回一个指针A,而这个指针A 竟然又 指向另外一个指针B 。注意这个指针B 是只读的! 现在貌似又要返回四次左看。 9 四次左看 > 是时候结束了 没有了const 没有了volatile 没有了 *,我们要最后收留了 目前是这样的 * const *(*next)(); next 是一个函数指针 该函数返回一个指针A, 指针A 指向另外一个只读指针B 那么这个只读指针B 又指向什么东东呢。请看下文 10 结尾 > 还剩 char 不言而喻 只读指针B 指向一个char 类型。终于走到了尽头。 next 是一个函数指针 该函数返回一个指针A, 指针A 指向另外一个只读指针B 这个只读指针B指向了 char 类型数据 ! #endif #if example02: void (*signal)(int sig,void(*func)(int)))(int); 稍后给出 #endif printf("hello This is a special world of C language!!\n"); return 0; } /* 番外篇: 摘自百度: 标识符使用来标识源程序中的某个对象的名字的,这些对象可以是语句、数据类型、函数、 变量、常量、数组等。 C语言规定:一个标识符由字母、数字和下划线组成,第一个字符必须是字母或下划线, 通常以下划线开头的标识符是编译系统专用的,所以在编写C语言程序时,最好不要使用以 下划线开头的标识符。但是下划线可以用在第一个字符以后的任何位置。 基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义, 可以取对象名字全称或名字的一部分。命名要基于容易记忆容易理解的原则。保证名字的 连贯性是非常重要的。 */
总结: 通常我们用到函数声明不多,形式也就那么几种,但是当你学会基础,打算深入了解,比如阅读内核代码,你将碰到一系列本文中出现的声明。所以假如你想进一步提升自己,还需要多多实践,看完本文不代表你完全会用,但我可以说 你已经入门.
相关文章推荐
- C++语言笔试题目写一个函数计算当参数为n(n很大)时的值 1-2+3-4+5-6+7......+n&字符指针、浮点数指针、以及函数指针占用的内存等
- VBA,我的第一门语言(带你走进VBA的世界)
- 世界编程语言排名:Ruby崛起,狂升15位
- (三)C语言基础(数组,内存分配,函数指针)
- 走出语言的缚束,沟通世界
- 世界各国语言学习网站
- c 语言获取系统时间和世界各时区时间
- 2007世界程序语言排名
- 世界编程大赛冠军用汇编语言所写的三维程序
- 世界语言对照表
- 1.1欢迎来到汇编语言的世界
- 世界国家官方语言大全-索引版
- 语言就是建立自己和世界的联系
- C语言结构体中定义函数指针详解
- 带您走进七周七语言的程序世界
- 工作两年(六)——进入非C/C++语言的世界
- Javascript -- IT世界的未来的语言
- 世界国家官方语言大全-大洲版
- 语言就是建立自己和世界的联系
- 带您走进七周七语言的程序世界