1.函数指针声明的格式及简单的使用

(1)格式:(返回值)(*函数指针名)(参数列表)    例如:声明一个无参数无返回值的函数指针(void)(*p)(void)。

(2)将函数指针指向某个无参数无返回值的函数fun();(注:fun函数我就不在这里声明了)  形如:p = fun;(注意的是:fun后面不用加括号) ,这句话就是表示将函    数指针p指向名为fun的函数。

(3)使用函数指针调用fun函数,形如:p();(等价于直接调用fun())。

所以完整的使用应该为三个步骤:1.声明 2.指向函数(必须返回值参数和被指向的函数一样)3.调用

相信这样理解起来应该还是蛮容易的,可能有人要问,既然声明函数指针调用函数和直接调用函数达到的效果一样,那干嘛要用函数指针呢,不是   多此一举吗???好吧,我开始也这样认为,看一下下面的例子吧(也很简单,毕竟水平有限啊。。啊。。。啊)

2.函数指针简单的理解和认识

void (*p)(void);

int num;

while (1) {

scanf("%d", &num);

if (num == 1) {

p = func1;

}else if(num == 2){

p = func2;

}else

break;

p();

}

这个简单的小例子,根据你输入的数字是1还是2,来决定调用哪个函数,输入1,调用fun1(),输入2,调用fun2().相信大家也能看出来。

我只声明了一个函数指针p,通过输入的不同,来决定p函数指针是指向fun1还是fun2,最后通过只调用p(),来达到调用函数的结果。

3.函数指针的简单的应用

1.其实看完上面的小例子,大家应该还没感觉到函数指针的好处,毕竟直接调用fun1和fun2也是很容易的。

下面分享一个函数指针在排序中的应用,通过传入的排序方式不同,从而对数组元素进行排序。(代码是用OC语法写的,还是很容易懂的~~~)

NSArray* sort(NSArray *array,NSInteger(*p)(id obj1,id obj2))

{

NSMutableArray *arr = [NSMutableArray arrayWithArray:array];

NSInteger len = [arr count];

for (int i = 0 ; i < len-1; i++)

{

for (int j = 0; j < len -i -1; j++)

{

if(p(arr[j],arr[j+1]))//函数指针的调用

{

[arr exchangeObjectAtIndex:j withObjectAtIndex:j+1];

}

}

}

return arr;

}

NSInteger valueSort(id obj1,id obj2)//根据值排序

{

if([obj1 intValue]>[obj2 intValue])

{

return 1;

}

return 0;

}

NSInteger asciiSort(id obj1,id obj2)//根据ASCII码排序

{

if([obj1 compare:obj2] == 1)

{

return 1;

}

return 0;

}

NSInteger lengthSort(id obj1,id obj2)//根据字符串长度排序

{

if([obj1 length]>[obj2 length])

{

return 1;

}

return 0;

}

int main(int argc, const char * argv[]) {

@autoreleasepool {

NSArray *array = @[@"91111",@"22",@"333",@"55"];

NSArray *arr =  sort(array, valueSort);

    //NSArray *arr =  sort(array, asciiSort);

//NSArray *arr =  sort(array, lengthSort);

for (int i = 0; i<[arr count]; i++)

{

NSLog(@"%@",arr[i]);

}

}

return 0;

}

例子很简单,个人觉得函数指针在代码的重构应该起着一定的作用,试想如果将sort函数封装起来,以后每次我们自己需要自定义方法来实现某种排序,只要写一个自己的方法就行,通过函数指针传入到封装的代码中,实现自定义功能,这样也是很不错的嘛,至少省下了很多重复的代码~~~(其实OC中的block我觉得很函数指针就是非常类似的

谈谈自己对C语言中函数指针的一些理解 (第一次写博客,有点小兴奋哈)的更多相关文章

  1. 第一次写博客,关于前端开发deMVC在js中的应用

    对前端MVC MVC分别是model.view.controller的缩写,模型.视图.控制器.这些更加偏向于后台,在以前MVC是只属于后台的.当然随着技术的进步,前端的大牛们将后台的一些东西应用于前 ...

  2. 总结下js中匿名函数的写法~好几天没写博客了。。。

    小哥最近很是心烦啊,不仅仅要继续以现任前端小白,未来前端攻城狮的身份苦逼学习,还要用剩余的时间去完成毕业设计.早知如此,当初我为毛要报考数学这么个苦逼专业....昨天一整天的时间在研究毕设,感觉代码已 ...

  3. sikuli+eclipse对于安卓app自动化测试的应用(第一次写博客,有些语言还不太专业,望海涵)

    Sikuli是什么? 下面是来自于官网的介绍:Sikuli is a visual technology to automate and test graphical user interfaces ...

  4. C语言编程中函数指针的定义及使用

    C语言中函数指针的定义: typedef int (*funcPtr)(int, int)表示定义了一个函数指针funcPtr,这个函数指针只能指向如下: int add(int, int).int ...

  5. C语言中函数和指针的參数传递

    近期写二叉树的数据结构实验.想用一个没有返回值的函数来创建一个树,发现这个树就是建立不起来,那么我就用这个样例讨论一下c语言中指针作为形參的函数中传递中隐藏的东西. 大家知道C++中有引用的概念,两个 ...

  6. 【ZZ】C 语言中的指针和内存泄漏 & 编写高效的C程序与C代码优化

    C 语言中的指针和内存泄漏 http://www.ibm.com/developerworks/cn/aix/library/au-toughgame/ 本文讨论了几种在使用动态内存分配时可以避免的陷 ...

  7. GO语言中的指针

    http://www.tizgrape.com/?p=100 Go语言中的指针语法和C++一脉相承,都是用*作为符号,虽然语法上接近,但是实际差异不小. Go使用var定义变量: var v6 *in ...

  8. C语言中函数参数传递

    C语言中函数参数传递的三种方式 (1)值传递,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值.(2)地址传递,就是把 ...

  9. C语言中函数返回字符串的4中方法

    C语言中函数返回字符串的4中方法 函数的构成部分:返回类型.函数名称.参数.函数主体 参数:函数调用时传入的参数称为实参,函数定义时出现的参数为形参 形参的作用在于接收实参传入的值,形参和函数内部的其 ...

随机推荐

  1. swift_Dictionary 字典

    // //  main.Swift //  字典 // //  Created by zhangbiao on 14-6-15. //  Copyright (c) 2014年 理想. All rig ...

  2. 几款极好的 JavaScript 文件上传插件

    文件上传功能作为网页重要的组成部分,几乎无处不在,从简单的单个文件上传到复杂的批量上传.拖放上传,需要开发者花费大量的时间和精力去处理,以期实现好用的上传功能.这篇文章向大家推荐几款很棒的 JavaS ...

  3. 数据库大作业--由python+flask

    这个是项目一来是数据库大作业,另一方面也算是再对falsk和python熟悉下,好久不用会忘很快. 界面相比上一个项目好看很多,不过因为时间紧加上只有我一个人写,所以有很多地方逻辑写的比较繁琐,如果是 ...

  4. 补PSP进度(10.28-11.3)

    本周PSP进度 10月31号 内容 开始时间 结束时间 打断时间 净时间 看蛋白质相互作用论文 8:40 10:35 约12m 103m 分析约跑功能 13:20 13:55 0 35m 练习VSL2 ...

  5. Hprose question

    1 在服务端 接口的开发中 如果定义了index()方法 中间不能够有参数,否则报错. 2 接口方法中的参数 最好使用单参数 如fun($uid ) 或者 如果需要多个参数 fun($param){$ ...

  6. Balanced Binary Tree [LeetCode]

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...

  7. JAVA集合类汇总

    一.集合与数组 数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用. ...

  8. python【4】-函数

    一. 定义函数 定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回.如果没有return语句,函数执行完毕后也会返 ...

  9. python中enumerate()的用法

    先出一个题目:1.有一 list= [1, 2, 3, 4, 5, 6]  请打印输出:0, 1 1, 2 2, 3 3, 4 4, 5 5, 6 打印输出, 2.将 list 倒序成 [6, 5, ...

  10. 关于链接到QQ客服的问题,原来只需要在a标签上加一串话而已呐~~~~

    <a class="btn" target=blank href=tencent://message/?uin=&Site=www.woyouli.com&M ...