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

C语言大世界—————08指针类型(函数指针)上

2014-12-04 16:16 253 查看
俗话说(当然是我说的哈):一zhi在手,要啥没有?"zhi"当然不是博主小学文化出来卖弄拼音,只不过这个zhi还真不好确定是哪个,我说指吧,你说应该址,反之亦然。因此只好退而求其次,用zhi代替。有人要求来个函数指针的话题,虽说平常不怎么涉及(或许是你接触的不多),当我在看linux内核源码时候,两字“头疼”,既然是个大项目,肯定少不了众多文件,每个文件中必然有很多函数,再然后就是函数的声明可不像我们平常那样过家家。因此,今天探讨下函数指针,只为充实下自己(为以后装B铺垫下)。内容正在编写中。

博主申明:本人学识浅薄不能面面俱到,望抛砖引玉.若有错误或者不妥地方,请留言指正。最后请各位大牛朋友来关注下小弟,留言下,算给新人一个支持鼓励吧。

#include "stdio.h"

int main(void)
{
	//开篇 
	/*
		今天的主题是函数。那么先来聊下函数一个函数的声明一般的形式是这样的:
		(函数返回类型) 函数名字(参数列表){
			函数实现内容 
		} 
		以下给出几个例子来简单说明,我一直都强调谁是主角,一开始就应该让她占据
	 	我们的眼球,因此你最应该看到的是函数名字。 
		例如: 
		01.void func(void){}						
			函数名func,函数传入参数列表没有,函数返回类型void,即没有,这个没有呢,
		不是说我这个函数不干事了,恰恰相反,或许她肩负着巨大的任务,只不过她
		甚是低调,不对外返回数据。因此函数内容我们可以来意淫下,比如打印个
		"hello world",比如我对一个数据+ - * /,(喂!不是说没有数据传入吗!),施主,
		咱们可以来全局变量嘛。    

		02.int  func(int para1,char para2...){}
			函数名func,函数传入参数para1,char para2,那么...可没法实现,这里我只不
		过想告诉你,她心胸宽广,可以容纳多个参数。函数返回类型int,也许她对传入的
		para1和para2撮合下 ,诞生了一个新产物,然后返回。 
		
		03.int* func(int *para1,char *para2...){}
			函数名func,函数传入参数 都是指针,函数返回类型,这个可就厉害了!指向int
		类型的指针,别激动,我说的厉害是要通过对比才方能显现,就好比秋香要在一堆
		如花中才能衬托其倾国之容。这个先按下不表 
	*/
	//demo1: 
	/*
		主题是函数,主角是什么? 指针!函数指针!
		以下内容,为求正确性以及易懂性,能打印的尽量打印出来  
		首先搬出刚才那个"厉害的东西"  非常抱歉,函数定义只能放在主函数main后面了 
	*/	
	int *func(int a ,int b);		 
	/*
		嗯这声明到底是函数指针呢,还是指针函数。这个确实是个伤脑筋的问题,你要知道
	我在上讲中提到了,指针可以指向其他类型,包括基本的int float char ...当然也包括
	数据类型 例如int (*pt)[3];	那么现在要提出另外一个类型,函数!那么上面这个申明
	是吗? 
		想要回答这个问题,我们需要知道一些操作符的优先级,该死的,有点印象,赶快去
	查查。Please 打住,难道你想把优先级看几遍,背熟了再来解决问题?时间不允许哦。
	我来分析:
		抓住主角: func
		然后: 是 *func?  还是 func()?,()括号说:"抱歉 '*',虽然你我同为func的左右
		    	,但是我优先级高,我先和他一起结合了(请勿YY)"。那么 func() 很熟悉不是吗?
				嗯,到现在我已经知道func 是个函数了.....
		接着:好吧,'*'表示我终于可以和func在一起了,但是!对不起,func已经定了,来
		      不及了。因此,现在剩下的情况是这样的 int *;
		最后:int * ,这或许就是宿命,他们结合在了一起 作为了函数返回类型,是一个指向
			  int类型的指针。你也知道,作为一个有返回类型的函数,是有节操的,就如声明的
			  时候一样,int func() 必须要返回一个int整数 char func()要函数一个返回一个
			  char字符,那么int* func()就要返回一个 int* 指针啦! 
	*/
	//为了在来了解下 我想打印个函数地址给大家。 
	printf("the func address is 0x%x\n",func);//0x401336
 	//要知道我们有cpu,但是没有数据,cpu又能干嘛呢,至于数据都是存储在内存中,变量是,
	 //函数自然也是,就好比现在 函数从0x401336这里开始存起,假如你有一个指针指向了这里
	 //而这个指针类型是这个函数的话,那么恭喜你,你拥有了她。 
	
	//demo2:
	/*
		我想是时候开始扯我们的函数指针了(前面那个是指针函数 别搞错了,注意修饰词!!)
		举个例子哈 
	*/ 
	int add(int a,int b); 
	int sub(int a,int b);
	//hey 别闹 说好的函数指针呢....怎么来四则运算了? OK!函数指针驾到》
	int (*operate)(int a,int b);
	/*
		这玩样是函数指针? 和 int* operate(int a ,int b) 看着眼熟啊、也许吧.....
		可是分析之后,你就不这么认为了
		首先主角: operate 是变量名。
		其次:貌似这次()没法和*争宠了 因为这次她快了一步,和operate结合一起
				也就是 *operate,这个简单,是一个指针,至于这是一个指向什么的指针,暂时
				我无从得知。
		在看下面:都说优先级高了 右边的(int a ,int b)看到吗,忽略里面的参数列表,
				暂时当做纯(),那么和指针一结合,我们恍然大雾(*operate)();是一个指向函数
				的指针,至于这个函数是什么类型,比如返回什么类型啦,传入的参数列表(这个知道
				int a,int b); 等等那最前面的是int该怎么解释?我只想说int作为一个函数的
				返回类型只不过是函数的一部分, 
		好了 其实结果已经出来了 那就是operate 是一个函数指针,她指向的函数类型是
		int (*)(int a,int b) 也就是传入的参数是int a,int b,返回的是一个int整数。 
	*/ 
	//请注意!函数指针,函数? 指针? 前者是修饰,我去掉修饰,指针是什么?变量!那么假如
	/*
		int (*operate)(int a,int b)
		{
			...
			return rst;
		}	
	*/ 
	//你可以放到下面试试,这是一个变量啊,绝逼会出现一个错误 invalid function declaration 
	//想下一段可以实现功能的函数代码从一个起始地址放好,作为标识,我给这个起始地方叫Add
	//不会再改变了 而函数指针是一个变量,只要类型匹配我就可以指向那个Add的地方
	//先打印下函数地址
	printf("the add function addr is 0x%x\n",add); 		
 	printf("the sub function addr is 0x%x\n",sub);		
 	//现在该我们的函数指针出马了 由于类型匹配 因此 可以那么指!
 	operate = add;
	printf("the operate addr is 0x%x\n",operate); 
	printf("use operate as add func the rst is %d\n",operate(1,2));
 	operate = sub;
	printf("the operate addr is 0x%x\n",operate); 
	printf("use operate as sub func the rst is %d\n",operate(1,2));	
	
	//很好用嘛!地址呢 是一样一样的 操作呢是可以进行的
	/*
		函数指针呢 我想可以那么用 比如***一个计算器! "+ - * / "4种操作符 
		我已经获取到了操作符 以及两个操作数x y
		switch(operator)
		{
			case '+':
				operate = add;
			break;
			case '*':
				operate = sub;
			break;
			case '*':break;
			case '/':break;
			default:break; 
		} 
		operate(x,y);		//调用操作
		这样 是不是有点意思 当然你绝逼可以直接在上面switch中就进行加减乘除操作、 
	*/ 
	//全是基础的东西 这只是上级 我马上在中集给出一个有趣的例子 
} 
//demo1 
int *func(int a ,int b)
{
		static int rst;
		rst = a+b;
		return &rst; 
} 
//demo2
int add(int a,int b)
{
	int rst;
	rst = a+b;
	return rst;
}
int sub(int a,int b)
{
	int rst;
	rst = a-b;
	return rst;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: