小议函数指针

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;参考

怎样将成员函数指针强制转换成void*指针




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值