分享

小议函数指针

 心不留意外尘 2016-05-18
http://blog.csdn.net/silyvin/article/details/32201683
2014

  1. void f1(int *pi)  
  2. {  
  3.     int *a = pi;  
  4. }  
  5.   
  6. void f2(double *pd)  
  7. {  
  8.     int *a = (int *)pd;  
  9.     *a = 2000;  
  10. }  
  11.   
  12. class B  
  13. {  
  14. public:  
  15.     B():member(-1){}  
  16.     int member;  
  17.     int func(int _i){return _i * 2;}  
  18. };  
  19.   
  20. int _tmain(int argc, _TCHAR* argv[])  
  21. {  
  22.     void *pvoid=0;  
  23.     int ret(-1000);  
  24.   
  25.     // 1  
  26.     void (*pfn)(int *) = (void (*)(int *))&f2;  
  27.     pvoid = pfn;  
  28.     void (*pfn2)(int *) = (void (*)(int *))pvoid;  
  29.     int iTestInt(4);  
  30.     int *piTest = &iTestInt;  
  31.     pfn2(piTest);  
  32.   
  33.     // 2  
  34.     int B::*pm = &B::member;  
  35.     pvoid = ±  
  36.     B b;  
  37.     ret = b.*(*(int B::*(*))pvoid);  
  38.   
  39.     // 3  
  40.     int (B::*pf)(int) = &B::func;  
  41.     pvoid = &pf;  
  42.     int (B::*pf2)(int) = *(int (B::*(*))(int))pvoid;  
  43.     ret = (b.*pf2)(2);  
  44.   
  45.     return 0;  
  46. }  


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条评论

    发表

    请遵守用户 评论公约

    类似文章 更多