zoukankan      html  css  js  c++  java
  • typedef使用

    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;

     1 #include <stdio.h>
     2 typedef int (*FP_CALC)(int, int);
     3 int  add(int a, int b)
     4 {
     5     return a + b;
     6 }
     7 
     8 int sub(int a, int b)
     9 {
    10     return a - b;
    11 }
    12 
    13 int mul(int a, int b)
    14 {
    15     return a * b;
    16 }
    17 
    18 int div(int a, int b)
    19 {
    20     return b?a/b:-1;
    21 }
    22 
    23 //定义一个函数,参数是op,返回值是一个函数指针,
    24 //该函数指针类型:参数是2个int, 返回值是int
    25 //该函数的作用是根据操作符返回对应函数的地址;
    26 30 FP_CALC calc_func(char op) 
    27 {
    28     switch (op)
    29     {
    30         case '+': return add;   //返回地址
    31         case '-': return sub;
    32         case '*': return mul;
    33         case '/': return div;
    34         default:
    35                   return NULL;
    36     }
    37     return NULL;
    38 }
    39 
    40 //s_calc_func为函数,参数是op;
    41 //返回值为一个拥有  两个int参数,返回类型为int的函数指针
    42 int (*s_calc_func(char op))(int, int)
    43 {
    44     return calc_func(op);
    45 }
    46 
    47 //最终用户直接调用的函数,该函数接收两个int整数,和一个算术运算符,返回两数的运算结果
    48 int calc(int a, int b, char op)
    49 {
    50     FP_CALC fp = calc_func(op); //根据预算得到各种运算的函数地址;
    51         int (*sp)(int, int) = s_calc_func(op);  //用于测试;
    52 //  ASSERT(fp = sp); //设置断言
    53         if(fp) return fp(a, b); //根据上一步得到的函数的地址调用相应函数,并返回结果
    54             else return -1;
    55 }
    56 
    57 int main()
    58 {
    59     int a = 100, b = 20;
    60     printf("calc(%d, %d, %c) = %d
    ", a, b, '+', calc(a, b, '+'));
    61     printf("calc(%d, %d, %c) = %d
    ", a, b, '-', calc(a, b, '-'));
    62     printf("calc(%d, %d, %c) = %d
    ", a, b, '*', calc(a, b, '*'));
    63     printf("calc(%d, %d, %c) = %d
    ", a, b, '/', calc(a, b, '/'));
    64     return 0;
    65 }
  • 相关阅读:
    [转]23种经典设计模式的java实现_5_职责链模式
    ARM汇编伪指令介绍
    avrstudio 5 按键控制led移位
    linux 应用程序里面调用shell
    avrstudio 5 同时点亮8只数码管
    从Linux程序中执行shell(程序、脚本)并获得输出结果(转)
    avrstudio 5 矩阵键盘
    linux 格式化输出输入函数
    Google 浏览器(2011)书签同步
    linux下面的路径问题
  • 原文地址:https://www.cnblogs.com/chris-cp/p/4901817.html
Copyright © 2011-2022 走看看