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; }
相关文章推荐
- C语言的函数指针类型和回调函数-源码
- C语言中的函数类型和函数指针
- C语言之数组专题:数组指针、指针数组、数组做函数参数退化、数组名、数组类型
- C语言回顾(六、基类型,数组指针,字符串指针,函数指针,文字常量区)——iOS开发基础
- C语言之数组专题:数组指针、指针数组、数组做函数参数退化、数组名、数组类型
- C语言学习9: malloc动态内存存储,动态内存分配去空格字符增长版,动态内存分配去符号incr增长版,型参和返回值都是int型的函数的指针,main函数的地址也可以用指针指向,typedef定义函数指针,函数定义与嵌套的作用,返回函数指针类型,const作用
- C语言实现的线性表 函数形参:指针类型与变量类型的区别 (SqList *L)(SqList L)
- 从指向类成员函数的指针看指针的“类型”
- C语言中的函数指针
- 关于C语言中的函数指针
- 成员函数指针和其他类型的强制转换,使用一般指针调用成员函数
- 用C语言来实现的类似C++函数的重载特性-----void*指针闲谈
- C语言之指针、数组和函数(转)
- C语言之指针、数组和函数
- 指向成员函数的指针类型成员变量
- C语言里的指针类型转换
- C语言之指针、数组和函数
- C语言之指针、数组和函数
- C语言之指针、数组和函数
- c语言中的函数指针