谈谈自己对C语言中函数指针的一些理解 (第一次写博客,有点小兴奋哈)
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语言中函数指针的一些理解 (第一次写博客,有点小兴奋哈)的更多相关文章
- 第一次写博客,关于前端开发deMVC在js中的应用
对前端MVC MVC分别是model.view.controller的缩写,模型.视图.控制器.这些更加偏向于后台,在以前MVC是只属于后台的.当然随着技术的进步,前端的大牛们将后台的一些东西应用于前 ...
- 总结下js中匿名函数的写法~好几天没写博客了。。。
小哥最近很是心烦啊,不仅仅要继续以现任前端小白,未来前端攻城狮的身份苦逼学习,还要用剩余的时间去完成毕业设计.早知如此,当初我为毛要报考数学这么个苦逼专业....昨天一整天的时间在研究毕设,感觉代码已 ...
- sikuli+eclipse对于安卓app自动化测试的应用(第一次写博客,有些语言还不太专业,望海涵)
Sikuli是什么? 下面是来自于官网的介绍:Sikuli is a visual technology to automate and test graphical user interfaces ...
- C语言编程中函数指针的定义及使用
C语言中函数指针的定义: typedef int (*funcPtr)(int, int)表示定义了一个函数指针funcPtr,这个函数指针只能指向如下: int add(int, int).int ...
- C语言中函数和指针的參数传递
近期写二叉树的数据结构实验.想用一个没有返回值的函数来创建一个树,发现这个树就是建立不起来,那么我就用这个样例讨论一下c语言中指针作为形參的函数中传递中隐藏的东西. 大家知道C++中有引用的概念,两个 ...
- 【ZZ】C 语言中的指针和内存泄漏 & 编写高效的C程序与C代码优化
C 语言中的指针和内存泄漏 http://www.ibm.com/developerworks/cn/aix/library/au-toughgame/ 本文讨论了几种在使用动态内存分配时可以避免的陷 ...
- GO语言中的指针
http://www.tizgrape.com/?p=100 Go语言中的指针语法和C++一脉相承,都是用*作为符号,虽然语法上接近,但是实际差异不小. Go使用var定义变量: var v6 *in ...
- C语言中函数参数传递
C语言中函数参数传递的三种方式 (1)值传递,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值.(2)地址传递,就是把 ...
- C语言中函数返回字符串的4中方法
C语言中函数返回字符串的4中方法 函数的构成部分:返回类型.函数名称.参数.函数主体 参数:函数调用时传入的参数称为实参,函数定义时出现的参数为形参 形参的作用在于接收实参传入的值,形参和函数内部的其 ...
随机推荐
- git配置笔记
windows: 1. PS>ssh-keygen -t rsa -C "your_email@youremail.com" ssh-keygen命令报错--无法将“ssh- ...
- PE文件学习系列三-PE头详解
合肥程序员群:49313181. 合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q Q:408365330 E-Mail:egojit@qq.com 最近比较忙 ...
- HTML 表格<table><caption><th><tr><td><thead><tbody><tfoot><col><colgroup>
<table>标签: 定义和用法: <table>标签定义HTML表格. 简单的HTML表格由table元素以及一个或多个tr.th或td元素组成. tr元素定义表格行,th元 ...
- java selenium (一) selenium 介绍
Selenium 是目前用的最广泛的Web UI 自动化测试框架. 本系列文章,将深入简出来讲解selenium 的用法 文章的末尾处, 有整个系列的链接 阅读目录 selenium 的命名 sele ...
- PDF 补丁丁 0.5.0.2520 测试版发布:新春快乐!
新的PDF测试版今天发布了. 新的测试版比旧测试版本增加了如下功能: 合并文件功能可以导出.导入文件列表,方便合并大量文件.一天干不完,保存一下,明天继续来. 合并文件功能可以统一已合并文件的旋转方向 ...
- ubuntu命令
chmod 777.755 root权限 rm 删除文件 rm -rf 删除文件夹 ctrl+o 保存 ctrl+x 退出 :wq 保存并退出 查看一台服务器上面哪些服务及端口 netstat -l ...
- docker定制化镜像的构建及基于该定制的镜像创建容器
1.在项目里创建Dockerfile(注意大小写)文件,执行构建命令:docker build -t tiny-node-1 /root/tiny-node-docker 其中tiny-node ...
- Cogs 14. [网络流24题] 搭配飞行员
这道题其实蛮好想的,因为分为正,副飞行员.所以就把正飞行员当作Boy,副飞行员当作Girl.然后做Hungry即可. #include<bits/stdc++.h> using names ...
- ES6模块加载
两种加载方式 加载方式 规范 命令 特点 运行时加载 CommonJS/AMD require 社区方案,提供了服务器/浏览器的模块加载方案 非语言层面的标准 只能在运行时确定模块的依赖关系及输入/输 ...
- jdbc escape
假如有这样1个查询请求,模糊查询标题中包含a%b_cc’d的记录,正确的sql应该是下面这样的: select * from t_sch_work_info t where t.title ...