您的位置:首页 > 编程语言 > C语言/C++

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语言程序时,最好不要使用以
下划线开头的标识符。但是下划线可以用在第一个字符以后的任何位置。

基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,
可以取对象名字全称或名字的一部分。命名要基于容易记忆容易理解的原则。保证名字的
连贯性是非常重要的。 
*/


总结: 通常我们用到函数声明不多,形式也就那么几种,但是当你学会基础,打算深入了解,比如阅读内核代码,你将碰到一系列本文中出现的声明。所以假如你想进一步提升自己,还需要多多实践,看完本文不代表你完全会用,但我可以说 你已经入门.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: