注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

随机过程

http://superware.blog.163.com

 
 
 

日志

 
 

关于函数指针  

2014-07-24 19:34:28|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一、简单情况

#include <stdio.h>

int add (int a, int b)
{
return a + b;
}

int sub (int a, int b)
{
return a - b;
}

int mul (int a, int b)
{
return a * b;
}

int div (int a, int b)
{
return b ? a/b : -1;
}

int mod (int a, int b)
{
return b ? a/b : -1;
}
// 定义函数指针类型
typedef int (*pfun)(int, int);

int main (int argc, char *argv[])
{
int a = 5;
int b = 2;
// 函数指针数组
int (*f[5]) (int, int);
// 函数指针,下面的两句是一个意思
int (*ptr) (int, int);
pfun p;

// 对函数指针数组赋值
f[0] = add;
f[1] = sub;
f[2] = mul;
f[3] = div;
f[4] = mod;

printf ("%d + %d = %d\n", a, b, f[0](a, b));
printf ("%d - %d = %d\n", a, b, f[1](a, b));
printf ("%d * %d = %d\n", a, b, f[2](a, b));
printf ("%d / %d = %d\n", a, b, f[3](a, b));
printf ("%d %% %d = %d\n", a, b, f[4](a, b));

printf ("\n");
// 函数指针的赋值
ptr = add;
printf ("%d + %d = %d\n", a, b, ptr(a, b));
ptr = sub;
printf ("%d - %d = %d\n", a, b, ptr(a, b));
ptr = mul;
printf ("%d * %d = %d\n", a, b, ptr(a, b));
ptr = div;
printf ("%d / %d = %d\n", a, b, ptr(a, b));
ptr = mod;
printf ("%d %% %d = %d\n", a, b, ptr(a, b));

printf ("\n");
// 函数指针赋值
p = add;
printf ("%d + %d = %d\n", a, b, p(a, b));
p = sub;
printf ("%d - %d = %d\n", a, b, p(a, b));
p = mul;
printf ("%d * %d = %d\n", a, b, p(a, b));
p = div;
printf ("%d / %d = %d\n", a, b, p(a, b));
p = mod;
printf ("%d %% %d = %d\n", a, b, p(a, b));

return 0;
}

结果:

5 + 2 = 7
5 - 2 = 3
5 * 2 = 10
5 / 2 = 2
5 % 2 = 1

5 + 2 = 7
5 - 2 = 3
5 * 2 = 10
5 / 2 = 2
5 % 2 = 1

5 + 2 = 7
5 - 2 = 3
5 * 2 = 10
5 / 2 = 2
5 % 2 = 1

函数指针是委托的原型,回顾一下。

二、复杂情况


#include <stdio.h>
#include <assert.h>

int add(int a, int b)
{
return a + b;
}

int sub(int a, int b)
{
return a - b;
}

int mul(int a, int b)
{
return a * b;
}

int div(int a, int b)
{
return b ? a/b : -1;
}

int mod(int a, int b)
{
return b ? a%b : -1;
}

// 定义委托

typedef int (*pfunc) (int, int);


// 注册消息 op
pfunc p_func(char op)
{
switch(op)
{
case '+':
return add;
case '-':
return sub;
case '*':
return mul;
case '/':
return div;
case '%':
return mod;
default:
return NULL;
}
}

// 用消息 op 调用委托
int func (int a, int b, char op)
{
pfunc p = p_func (s);

return p(a, b);

}

int main(int argc, char *argv[])
{
int a = 20;
int b = 7;

printf("calc(%d, %d, %c) = %d\n", a, b, '+', func(a, b, '+'));
printf("calc(%d, %d, %c) = %d\n", a, b, '-', func(a, b, '-'));
printf("calc(%d, %d, %c) = %d\n", a, b, '*', func(a, b, '*'));
printf("calc(%d, %d, %c) = %d\n", a, b, '/', func(a, b, '/'));
printf("calc(%d, %d, %c) = %d\n", a, b, '/', func(a, b, '%'));

return 0;
}

结果:

calc(20, 7, +) = 27
calc(20, 7, -) = 13
calc(20, 7, *) = 140
calc(20, 7, /) = 2
calc(20, 7, /) = 6


三、事件

#include <stdio.h>
#include <assert.h>

int add(int a, int b)
{
return a + b;
}

int sub(int a, int b)
{
return a - b;
}

int mul(int a, int b)
{
return a * b;
}

int div(int a, int b)
{
return b ? a/b : -1;
}

int mod(int a, int b)
{
return b ? a%b : -1;
}
// 定义委托
typedef int (*pfunc)(int,int);
// 注册消息
pfunc p_func(char op)
{
switch(op)
{
case '+':
return add;
case '-':
return sub;
case '*':
return mul;
case '/':
return div;
case '%':
return mod;
default:
return NULL;
}
}
// 定义事件
int (*s_p_func(char op)) (int , int)
{
return p_func(op);
}
// 响应事件
int func(int a, int b, char op)
{
int (*s_p) (int,int) = s_p_func(op);
return s_p (a, b);
}

int main(int argc, char *argv[])
{
int a = 20;
int b = 7;
printf("func(%d, %d, %c) = %d\n", a, b, '+', func(a, b, '+'));
printf("func(%d, %d, %c) = %d\n", a, b, '-', func(a, b, '-'));
printf("func(%d, %d, %c) = %d\n", a, b, '*', func(a, b, '*'));
printf("func(%d, %d, %c) = %d\n", a, b, '/', func(a, b, '/'));
printf("func(%d, %d, %c) = %d\n", a, b, '/', func(a, b, '%'));
return 0;
}

结果:
func(20, 7, +) = 27
func(20, 7, -) = 13
func(20, 7, *) = 140
func(20, 7, /) = 2
func(20, 7, /) = 6
  评论这张
 
阅读(73)| 评论(0)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017