频道栏目
首页 > 程序开发 > 综合编程 > 其他综合 > 正文
typedef 函数指针的用法
2013-01-15 15:35:54           
收藏   我要投稿
 typedef 行为有点像 #define 宏,用其实际类型替代同义字。

 

 不同点:typedef 在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换。

 

用法一:

 

typedef int (*MYFUN)(int, int); 

这种用法一般用在给函数定义别名的时候

上面的例子定义MYFUN 是一个函数指针, 函数类型是带两个int 参数, 返回一个int 

 

在分析这种形式的定义的时候可以用下面的方法: 

先去掉typedef 和别名, 剩下的就是原变量的类型. 

去掉typedef和MYFUN以后就剩: 

int (*)(int, int)

 

用法二:

 

typedef给变量类型定义一个别名.

 

typedef struct{ 

int a; 

int b; 

}MY_TYPE; 

 

这里把一个未命名结构直接取了一个叫MY_TYPE的别名, 这样如果你想定义结构的实例的时候就可以这样: 

MY_TYPE tmp;

 

第二种用法:typedef 原变量类型 别名

 

简单的函数指针的用法

 

//形式1:返回类型(*函数名)(参数表)

 

char(*pFun)(int);

 

//typedef char(*pFun)(int)   //跟上一行功能等同

 

/*typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。*/

 

char glFun(int a){return;}

 

void main()

 

{

 

pFun =glFun;

 

(*pFun)(2);

 

}

 

第一行定义了一个指针变量pFun.它是一个指向某种函数的指针,这种函数参数是一个int类型,返回值是char类型。只有第一句我们还无法使用这个指针,因为我们还未对它进行赋值。

 

第二行定义了一个函数glFun().该函数正好是一个以int为参数返回char的函数。我们要从指针的层次上理解函数-函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址。

 

下面是一个例子:

 

C代码 

//#include<iostream.h>   

#include<stdio.h>   

  

typedef int (*FP_CALC)(int, int);   

//注意这里不是函数声明而是函数定义,它是一个地址,你可以直接输出add看看   

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 p(int a, int b)   

{   

     return b? a/b : -1;   

}   

//定义一个函数,参数为op,返回一个指针。该指针类型为 拥有两个int参数、   

//返回类型为int 的函数指针。它的作用是根据操作符返回相应函数的地址   

FP_CALC calc_func(char op)   

{   

     switch (op)   

      {   

     case '+': return add;//返回函数的地址   

     case '-': return sub;   

     case '*': return mul;   

     case '/': return p;   

     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 (*s_fp)(int, int) = s_calc_func(op);//用于测试   

         // ASSERT(fp == s_fp);    // 可以断言这俩是相等的   

     if (fp) return fp(a, b);//根据上一步得到的函数的地址调用相应函数,并返回结果   

     else return -1;   

}   

  

void main()   

{      

    int a = 100, b = 20;   

  

      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, '/'));   

}  

[c]  

//#include<iostream.h>  

#include<stdio.h>  

typedef int (*FP_CALC)(int, int);  

//注意这里不是函数声明而是函数定义,它是一个地址,你可以直接输出add看看  

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 p(int a, int b)  

{  

return b? a/b : -1;  

}  

//定义一个函数,参数为op,返回一个指针。该指针类型为 拥有两个int参数、  

//返回类型为int 的函数指针。它的作用是根据操作符返回相应函数的地址  

FP_CALC calc_func(char op)  

{  

switch (op)  

{  

case '+': return add;//返回函数的地址  

case '-': return sub;  

case '*': return mul;  

case '/': return p;  

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 (*s_fp)(int, int) = s_calc_func(op);//用于测试  

// ASSERT(fp == s_fp);   // 可以断言这俩是相等的  

if (fp) return fp(a, b);//根据上一步得到的函数的地址调用相应函数,并返回结果  

else return -1;  

}  

void main()  

{  

int a = 100, b = 20;  

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, '/'));  

}  

运行结果

 

   calc(100, 20, +) = 120

 

   calc(100, 20, -) = 80

 

   calc(100, 20, *) = 2000

 

   calc(100, 20, /) = 5

点击复制链接 与好友分享!回本站首页
相关TAG标签 指针 函数
上一篇:vim的配置文件
下一篇:The usage of SQLPATH
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站