http://blog.csdn.net/silyvin/article/details/32201683 2014
- 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;参考
|