博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小议函数指针
阅读量:4079 次
发布时间:2019-05-25

本文共 1084 字,大约阅读时间需要 3 分钟。

void f1(int *pi){	int *a = pi;}void f2(double *pd){	int *a = (int *)pd;	*a = 2000;}class B{public:	B():member(-1){}	int member;	int func(int _i){return _i * 2;}};int _tmain(int argc, _TCHAR* argv[]){	void *pvoid=0;	int ret(-1000);	// 1	void (*pfn)(int *) = (void (*)(int *))&f2;	pvoid = pfn;	void (*pfn2)(int *) = (void (*)(int *))pvoid;	int iTestInt(4);	int *piTest = &iTestInt;	pfn2(piTest);	// 2	int B::*pm = &B::member;	pvoid = ±	B b;	ret = b.*(*(int B::*(*))pvoid);	// 3	int (B::*pf)(int) = &B::func;	pvoid = &pf;	int (B::*pf2)(int) = *(int (B::*(*))(int))pvoid;	ret = (b.*pf2)(2);	return 0;}

1. 将 void f2(double *) 这样的函数强行赋予 void (*)(int *) 指针仍然是可行的,只是调用函数时,形参 double *pd 会以64位的长度重新组合数据,在函数体内强行以 Int 形式数据组织,返回 iTestInt 为 2000;

并且, 函数指针与void *之间可以直接强制转换。

2. & 3. 无论是成员变量还是成员函数,都无法在一级指针的范畴与 void * 进行转换,因此对指向成员变量的指针取地址:

pvoid = ±

若需要再取得pm的值(偏移量),并通过该值访问对象数据,则:

int B::*(*ppm) = (int B::*(*))pvoid;    // 将pvoid 强制转化为 指向成员变量指针的指针,然后:

b.*(*ppm); // 访问 b.member;  “*ppm"为对ppm解引用 ,取得一个指向成员变量的指针,相当于 int B::*temp = *ppm; b.*temp; 再通过该指针(偏移量)访问成员变量member;

3中所述成员函数指针亦然,

平台:vs05 & vs08;参考

转载地址:http://iutni.baihongyu.com/

你可能感兴趣的文章
缓存篇-使用Redis进行分布式锁应用
查看>>
缓存篇-Redisson的使用
查看>>
phpquery抓取网站内容简单介绍
查看>>
找工作准备的方向(4月22日写的)
查看>>
关于fwrite写入文件后打开查看是乱码的问题
查看>>
用结构体指针前必须要用malloc,不然会出现段错误
查看>>
Linux系统中的美
查看>>
一些实战项目(linux应用层编程,多线程编程,网络编程)
查看>>
我觉得专注于去学东西就好了,与世无争。
查看>>
原来k8s docker是用go语言写的,和现在所讲的go是一个东西!
查看>>
STM32CubeMX 真的不要太好用
查看>>
STM32CubeMX介绍、下载与安装
查看>>
电机和桨叶要搭配选择
查看>>
现在发现如果无人机的电机不同,浆可能是不能混用的。
查看>>
不要买铝合金机架的无人机,不耐摔,易变形弯曲。
查看>>
ACfly也是基于FreeRTOS的
查看>>
F330装GPS的位置
查看>>
我想先用三个或者五个激光测距做无人机的室内定位和避障
查看>>
pixhawk也可以用Airsim仿真
查看>>
《无人机电机与电调技术》可以看看
查看>>