谈谈自己对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中方法 函数的构成部分:返回类型.函数名称.参数.函数主体 参数:函数调用时传入的参数称为实参,函数定义时出现的参数为形参 形参的作用在于接收实参传入的值,形参和函数内部的其 ...
随机推荐
- android native crash 分析
工具: addr2line arm-linux-androideabi-addr2line -aCfe libart.so 0x63006d 当libart.so包含符号表的情况下,可以查询到他的地址 ...
- cmd 常用指令
d: 进入d盘 cd xxx 进入某个目录
- Linux教程:Bash技巧,让chmod只修改某个目录下文件夹或者文件的权限
用Linux的人都知道chmod -R 可以修改一个文件夹下的所有文件和文件夹的权限,但是这也存在着一个很大的弊端,那就是修改的是所有的文件和文件夹的权限,如果我只想修改文件或文件夹的权限该怎么办呢? ...
- STM32 ADC 测电压
1. STM32F103 ADC 本例使用STM32F103芯片的PA1引脚测试模拟输入的电压值. 查看文档<STM32F103X.pdf>第31页,引脚定义图: 得知PA1使用ADC1的 ...
- oracle当前的连接数
怎样查看oracle当前的连接数呢?只需要用下面的SQL语句查询一下就可以了. select * from v$session where username is not null select us ...
- 未能加载文件或程序集“Newtonsoft.Json”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配
引用第三方的 fineui 库依然使用旧版本导致.更换 fineui为新版,或找到源码更改引用 为新版,问题解决.
- 如何使用Notepad++编译运行php
安装编译运行文件的插件.插件-Plugin Manager-Show Plugin Manager. 找到NppExec插件,从这个插件的名字来看就是各位文件的执行.点击Install.需要下载安装, ...
- Joomla软件功能介绍与开源程序大比拼Joomla,wordpress,Drupal哪个好?
Joomla 软件功能介绍: Joomla!是一套在国外相当知名的内容管理系统 (Content Management System, CMS),它属于Portal(企业入口网站)类型,顾名思义 ...
- thinkjs——session
工作中又遇到了session问题,于是整理一下有关thinkjs中的session使用小方法: 需要用户登录的网站基本上都离不开 Session,ThinkJS 里默认支持多种类型的 Session, ...
- Qt:Drag-Drop操作在QGraphicsView及Model/View框架下的实现
最近使用到Qt的Drag Drop功能,结合自己的例子写下来给大家分享一下.实现从QTreeView拖动Node到QGraphicsView上,以及QGraphicsView上item之间的拖动. 先 ...