谈谈自己对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中方法 函数的构成部分:返回类型.函数名称.参数.函数主体 参数:函数调用时传入的参数称为实参,函数定义时出现的参数为形参 形参的作用在于接收实参传入的值,形参和函数内部的其 ...
随机推荐
- torrent
The World's Largest BitTorrent System
- asp.net lodop单个打印
1.首先在列表页面增加以下代码 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind=&quo ...
- PHP之OOP要点摘要
类和对象: 类是生成对象的模板,对象是活动组件; 面向对象编程实际操作都是通过类的实例(而不是类本身)完成的: 访问控制(public.protected.private):(1) ...
- <python 深入理解>变量交换x,y=y,x实现机制--元组
python中有一种赋值机制即多元赋值,采用这种方式赋值时,等号两边的对象都是元组并且元组的小括号是可选的.通常形式为 x, y, z = 1, 2, 'a string' 等同于 (x, y, z) ...
- Windows Store App Image开发示例
通过上面的介绍,读者已经了解了Image对象及ImageBrush对象的使用方法和常用属性,在实际的开发工作中,比较常用的是Image对象,下面以一个幼儿园识物识字卡应用为例,来帮助读者更好的理解Im ...
- sass中中文注释报错
最近项目中用到了sass来编译css,但是scss代码中写了中文注释后编译报错, 经过查找文档和资料,终于找到了解决办法,即在scss文件顶部加上@charset "utf-8"; ...
- css3实现逐渐变大的圆填充div背景的效果
手机端现在的一些应用会运用上这样一个效果,就是duang的一下出现一个圆变大直到填充整个div,动感十足. 想到css3的scale属性,就自己来实现一下. <div id="bcd& ...
- 在数据库中varchar与char的区别
char是固定长度类型 varchar是可变的长度类型 char和varchar类型相似,但是它们的存储和检索方式不同.在MySQL5.0.3,它们在最大长度和是否保留尾部空格也不相同. char和v ...
- 为bootstrap添加更多自定义图标
From: http://blog.csdn.net/mengxiangfeiyang/article/details/45224731 Twitter Bootstrap 真是前端开发的瑞士军刀,作 ...
- RoseRT配置高版本的编译器
RoseRT配置高版本的VC++ ,我有VC++2008 Express ,实习时下载滴! 感谢Google,感谢大神地指导!困扰的问题终于解决,豁然开朗,so开始吧! 第一大步:重中之重, 确保nm ...