和菜鸟一起学c之函数指针
来源:互联网 发布:日本化妆品推荐知乎 编辑:程序博客网 时间:2024/05/18 11:28
还有SD卡的文件格式识别还不会,等明天和飞刀一起讨论下,基本的Android的SD卡的自动挂载已经实现了,可惜只支持FAT格式的,EXT格式的他不支持,添加了那些其他格式的挂载还是不行,主要是识别还不知道怎么去实现。好了,既然这么着,还是把以前看的一些函数指针做个记录吧。因为linux驱动中很多很多都用到了函数指针,一开始我都觉得奇怪,后来才知道这个。都怪自己以前对于指针的一些知识学得太少了,太浅了。
先看个简单的代码吧:
- #include <stdio.h>
- static int max(int a,int b)
- {
- if(a > b)
- {
- return a;
- }
- else
- {
- return b;
- }
- return 0;
- }
- int main(void)
- {
- int(*pmax)(int, int); //函数指针
- int x, y, z;
- pmax = max; //把函数max的首地址赋值给pmax函数指针
- printf("input two numbers:\n");
- scanf("%d%d",&x, &y);
- z = (*pmax)(x, y); //调用函数
- printf("maxmum = %d\n",z);
- return 0;
- }
再看看运行结果:
这里定义了一个函数指针,pmax,然后这个指针指向了max这个函数,然后当执行z = (*pmax)(x, y);时就会执行那个比较大小的函数了,然后就有了上面的结果了。
好了,接下去我们看看比较复杂的,本人写得搓搓的代码:
- #include <stdio.h>
- #include <math.h>
- #include <stdlib.h>
- struct point
- {
- int x;
- int y;
- };
- struct my_point_ops
- {
- struct point *p;
- double (*line_Length)(struct point p1, struct point p2);
- int (*draw_Point)(struct point *p);
- };
- double my_line_length(struct point p1, struct point p2)
- {
- return ((p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y));
- }
- int my_draw_point(struct point *p)
- {
- return p->x + p->y;
- }
- struct my_point_ops mops = {
- .line_Length = my_line_length,
- .draw_Point = my_draw_point
- };
- int main(void)
- {
- struct point p1 = {.x = 5, .y = 2};
- struct point p2 = {.x = 1, .y = 8};
- p3 = (struct point *)malloc(sizeof(struct point));
- p3->x = 3;
- p3->y = 4;
- printf("%lf\n", mops.line_Length(p1, p2));
- printf("%d\n", mops.draw_Point(p3));
- free(p3);
- return 0;
- }
不知道为什么Cfree运行错了,用GCC编译时过了的。这个就不纠结了。
首先看看这个my_point_ops结构体
- struct my_point_ops
- {
- struct point *p;
- double (*line_Length)(struct point p1, struct point p2);
- int (*draw_Point)(struct point *p);
- };
里面定义了两个函数指针。驱动里的代码越来越觉得有面向对象的概念了,什么都是一个一个对象一个结构了。
然后接下来看看这个,这个其实就是初始化了,其函数指针line_Length指向了my_line_length函数,函数指针draw_Point =指向了my_draw_point函数。
- struct my_point_ops mops = {
- .line_Length = my_line_length,
- .draw_Point = my_draw_point
- };
在看最后
- printf("%lf\n", mops.line_Length(p1, p2));
- printf("%d\n", mops.draw_Point(p3));
当调用mmops的成员函数mops.line_Length(p1, p2)其实就是调用了
- double my_line_length(struct point p1, struct point p2)
- {
- return ((p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y));
- }
而当调用mmops的成员函数mops.draw_Point(p3)其实就是调用了
- int my_draw_point(struct point *p)
- {
- return p->x + p->y;
- }
简单吧,就是这样的。哈哈。。。。
0 0
- 和菜鸟一起学c之函数指针
- 和菜鸟一起学c之函数指针
- 和菜鸟一起学c之函数中堆栈及运行内存情况
- 和菜鸟一起学c之函数中堆栈及运行内存情况
- 和菜鸟一起学c之函数中堆栈及运行内存情况
- 和菜鸟一起学c++之虚函数
- 和菜鸟一起学c之回调函数简单实例
- 和菜鸟一起学c之gcc编译过程及其常用编译选项
- 和菜鸟一起学c之gcc编译过程及其常用编译选项
- 和菜鸟一起学OK6410之交叉编译hello world
- 和菜鸟一起学OK6410之最简单字符驱动
- 和菜鸟一起学OK6410之Led字符驱动
- 和菜鸟一起学算法之二分法求极值问题
- 和菜鸟一起学算法之三分法求极值问题
- 和菜鸟一起学证券投资之国内生产总值GDP
- 和菜鸟一起学OK6410之蜂鸣器buzzer字符驱动
- 和菜鸟一起学证券投资之消费物价指数CPI
- 和菜鸟一起学OK6410之ADC模块
- 在VS中将CString转换为const char*
- 动态二维数组(可变二维数组) 指向指针的指针
- android webview初探
- 程序猿们注意啦~原知胃特级枸杞,电脑族护眼的好帮手
- POJ1548最小路径覆盖
- 和菜鸟一起学c之函数指针
- sqlserver 触发器实例代码
- 下载安装APK
- PHP CLI模式介绍及使用教程
- 蓝桥杯 逻辑推断 DFS+n个if
- POJ1698 最大流或者匈牙利
- Ios6中Auto Layout的使用详细图文介绍
- elasticsearch FuzzyLikeThisQueryBuilder实例
- 机器学习技法-5-Kernel Logistic Regression