C++------------typedef 函数指针类型定义
摘要bycrazyhacking:
typedef 是定义了一种“函数指针”类型,可以再声明很多变量。函数指针的定义是定义了一个变量。
进入正文:
代码简化, 促进跨平台开发的目的.
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的函数。我们要从指针的层次上理解函数-函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址。
下面是一个例子:
- //#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 div(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 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 (*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
C++------------typedef 函数指针类型定义的更多相关文章
- typedef 函数指针 数组 std::function
1.整型指针 typedef int* PINT;或typedef int *PINT; 2.结构体 typedef struct { double data;}DATA, *PDATA; //D ...
- 【C++】函数指针宏定义
看耗子叔文章学习虚函数表(http://blog.csdn.net/haoel/article/details/1948051)的时候被例子的第一句惊到了 typedef void(*Fun)(voi ...
- typedef函数指针使用方法
1.简单的函数指针的应用 形式1:返回类型(*函数名)(參数表) char (*pFun)(int); char glFun(int a){ return;} void main() { pFun = ...
- C 中typedef 函数指针的使用
类型定义的语法可以归结为一句话:只要在变量定义前面加上typedef,就成了类型定义.这儿的原本应该是变量的东西,就成为了类型. int integer; //整型变量int *pointer ...
- C中typedef 函数指针的使用
类型定义的语法可以归结为一句话:只要在变量定义前面加上typedef,就成了类型定义.这儿的原本应该是变量的东西,就成为了类型. int integer; //整型变量int *pointer ...
- c++ 自定义类型,函数指针类型
用typedef定义函数指针类型 -函数指针和函数指针数组 46课里边有如下代码 int add(int a,int b,int d) { return a+b+d; } int mul(int a, ...
- (转)typedef 函数指针的用法
typedef 函数指针的用法 在网上搜索函数指针,看到一个例子.开始没看懂,想放弃,可是转念一想,这个用法迟早要弄懂的,现在多花点时间看懂它,好过以后碰到了要再花一倍时间来弄懂它.其实很多时候都 ...
- C语言 函数指针一(函数指针的定义)
//函数指针 #include<stdio.h> #include<stdlib.h> #include<string.h> //函数指针类型跟数组类型非常相似 / ...
- C语言编程中函数指针的定义及使用
C语言中函数指针的定义: typedef int (*funcPtr)(int, int)表示定义了一个函数指针funcPtr,这个函数指针只能指向如下: int add(int, int).int ...
随机推荐
- phonegap的照相机API
1. Camera Api简单介绍 2. 拍照 3. 预览照片 一. Camera Api简单介绍 Camera选择使用摄像头拍照,或从设备相册中获取一张照片.图片以base64编码的 字符串或图片U ...
- Java学习笔记之一
1.对大小写敏感 2.class,类是构建所有Java应用程序和applet的构建块,Java应用程序中的全部内容都必须放置在类中. 3.类名,没有长度限制,必须以字母开头,可以使字母.数字.下划线的 ...
- drupal错误: Maximum execution time of 240 seconds exceeded
drupal7.5安装完成,导入汉化包时,出现错误: Fatal error: Maximum execution time of 240 seconds exceeded in D:\phpweb\ ...
- 【滚动数组】 dp poj 1036
题意:一群匪徒要进入一个酒店.酒店的门有k+1个状态,每个匪徒的参数是:进入时间,符合的状态,携带的钱. 酒店的门刚开始状态0,问最多这个酒店能得到的钱数. 思路: dp数组为DP[T][K]. 转移 ...
- OpenGL红宝书例子2.2 uniform变量的使用
1. 简单介绍一下OpenGL可编程渲染管线的流程 顶点着色 --> 细分着色 --> 几何着色 --> 片元着色 --> 计算着色 一般我们主要参与的阶段是顶点着色和片元着色 ...
- 80-th Level Archeology
80-th Level Archeology time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- CSS position 属性
position: relative | absolute | static | fixed 参考网站:http://blog.csdn.net/dyllove98/article/details/8 ...
- js 判断提交表单
<SCRIPT language=javascript> function check_book() { if(document.form1.Username.value=="& ...
- Rar related CMD
recursively add folder Document to archive: (with all the files) rar a *.rar Document recursively ad ...
- AutoTile 自动拼接(三) 学习与实践
今天把 图像数据保存完善了一下.天冷,没打多少字,见谅. 接着昨天说的,首先我们打开u3d,做一个空物体gameobject,然后做几个sprite,如下图所示 上面的sprite 排成四个 正方形. ...