1、利用typedef定义函数指针 

  代码简化,促进跨平台开发
  typedef行为有点类似#define 宏,用其实际类型替代同义字。
    不同点:typedef 在编译时被解释,因此让编译器来 应付超越预处理器能力的文本替换;
  用法一:
    typedef int (* func)(int, int);-----------这种用法一般用在给函数定义别名的时候;
    形式:typedef 返回值类型 (*函数别名)(参数列表)
    上面的例子定义func 是一个函数指针, 函数类型是:参数为两个int, 返回值为:int
  分析方法如下:
    先去掉typedef和别名,剩下的就是原变量的类型。
    如:int (*func)(int , int )
      char (*pFun)(int);  //定义了一个指针变量pFun,它是一个指向某种函数的指针,这种函数参数是一个int类型。
      //只有这一句我们还无法使用这个指针,因为我们还没对它进行赋值
      char glFun(int a){return ;}  //定义量一个函数glFun(),该函数正好是一个以int为参数返回char的函数,
       //我们从指针的层次上理解函数,函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址;

    int main()
    {
      pFun = glFun;
      (*pFun)(2);
      return 0;
    }

  用法二:
    typedef 给变量类型定义一个别名:
    typedef struct{
      int id;
      char name[10];
    }mystruct;
    这里把一个还未命名的结构体直接取了一个mystruct的别名。
    这样如果定义结构体的实例可以这样:
      mystruct tmp;

 #include <stdio.h>
typedef int (*FP_CALC)(int, int);
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:-;
} //定义一个函数,参数是op,返回值是一个函数指针,
//该函数指针类型:参数是2个int, 返回值是int
//该函数的作用是根据操作符返回对应函数的地址;
FP_CALC calc_func(char op)
{
switch (op)
{
case '+': return add; //返回地址
case '-': return sub;
case '*': return mul;
case '/': return div;
default:
return NULL;
}
return NULL;
} //s_calc_func为函数,参数是op;
//返回值为一个拥有 两个int参数,返回类型为int的函数指针
int (*s_calc_func(char op))(int, int)
{
return calc_func(op);
} //最终用户直接调用的函数,该函数接收两个int整数,和一个算术运算符,返回两数的运算结果
int calc(int a, int b, char op)
{
FP_CALC fp = calc_func(op); //根据预算得到各种运算的函数地址;
int (*sp)(int, int) = s_calc_func(op); //用于测试;
// ASSERT(fp = sp); //设置断言
if(fp) return fp(a, b); //根据上一步得到的函数的地址调用相应函数,并返回结果
else return -;
} int main()
{
int a = , b = ;
printf("calc(%d, %d, %c) = %d\n", a, b, '+', calc(a, b, '+'));
printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-'));
printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*'));
printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/'));
return ;
}

typedef使用的更多相关文章

  1. 19-typedef

    本文目录 一.typedef作用简介 二.typedef与指针 三.typedef与结构体 三.typedef与指向结构体的指针 四.typedef与枚举类型 五.typedef与指向函数的指针 六. ...

  2. #define与typedef在重定义类型中的区别

    #define 为完全的替换 typedef 重新定一个数据类型 eg #define charp1 char* typedef char* charp2charp1 a,b; //a char* b ...

  3. typedef

    第一.四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如:char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, ...

  4. 用typedef定义函数指针的问题

    在学习windows API的时候,遇到下面这段代码   以前见过的typedef的用法都是给一个数据类型取一个别名 typedef oldTypeName newTypeName   这种给数据类型 ...

  5. C语言语法 typedef小结

    在总结typedef之前,先了解一个专业术语: 常量指针(const pointer):常量指针在定义的时候必须被初始化,而且一旦初始化完成,则它的值就不能再改变. int errNumb = 0; ...

  6. 如何理解typedef void (*pfun)(void)

    问题: 在刚接触typedef void (*pfun)(void) 这个结构的时候,存在疑惑,为什么typedef后只有一"块"东西,而不是两"块"东西呢?那 ...

  7. C及C++中typedef的简单使用指南

    又是在学数据结构的时候,发现了之前学习的知识遗忘很多,在发现对C/C++中关键字typedef的理解还是没有到位后,我翻阅了学C++用到的课本,又问了度娘,也看了不少关于typedef用法的博客.于是 ...

  8. [转]关于typedef的用法总结

    不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中.typedef与#define有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了,看了网上一些 ...

  9. typedef 和 #define 的区别

    本文已迁移至: http://www.danfengcao.info/c/c++/2014/02/25/difference-between-define-and-typedef.html typed ...

  10. [转载]彻底弄清struct和typedef struct

    struct和typedef struct 分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int ...

随机推荐

  1. Windows2008 VPN登录

    上一章已经讲过Windows2008RT搭建VPN服务器搭建过程,接下来说一下win2008和win8的VPN登录 win8VPN连接过程 先说win2008的VPN登录过程.很简单: 打开网络和共享 ...

  2. Android4: Write Storage权限问题

    原文:Android4: Write Storage权限问题 2.3中声明 <uses-permission android:name="android.permission.WRIT ...

  3. javascript线程解释(setTimeout,setInterval你不知道的事)

    john resig写的一篇文章: 原文地址:http://ejohn.org/blog/how-javascript-timers-work/ 作为入门者来说,了解JavaScript中timer的 ...

  4. Xcode 真机测试破解方法(转加修改)xcode 4.3 通过

    Xcode 真机测试破解方法(转加修改)xcode 4.3 通过 生成本机证书 应用程序->实用工具->钥匙串访问 菜单:钥匙串访问->证书助理->创建证书, 然后按以下图片顺 ...

  5. cygwin在Windows8.1中设置ssh的问题解决

    为了在Windows 8.1上直接使用Linux环境和hadoop开发,装了cygwin,同时设置ssh无密码登录.   但正常ssh-keygen后复制到authorised_keys后登录出现提示 ...

  6. gallery利用代码定位图片并且不丢失动画效果

    安卓中,利用gallery.setSelection(position);可以手动定位图片 但是众所周知会丢失动画效果 即使是用gallery.setSelection(position,true); ...

  7. JS isArray记录

    var isArray=Function.isArray||function(0){ return typeof o === "object" && Object. ...

  8. Android tp的虚拟按键(virtual key)处理

    Android tp的虚拟按键处理 现在在越来越多的Android的手机都是虚拟按键来操作,但是对于开发者来说可能会关心Android对虚拟按键如何处理的.对Linux熟悉的人可能会说,it's ea ...

  9. sql中将null转换为空

    sql中varchar的默认值为null 当在页面绑定数据时就会出现无法绑定情况此时就需要在查询时转换为空,, isnull(key,'')  key 为字段名,后面的参数就是空值

  10. 开发者工具console

    **(2)$0 - $4 ** 控制台保存了最近5个在Elements面板选中的DOM元素,$0代表倒数第一个,$1代表倒数第二个,以此类推直到$4. 按f12,就会出现开发者工具,然后在左上角有个放 ...