zoukankan      html  css  js  c++  java
  • 小议函数指针

    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*指针




  • 相关阅读:
    WSDL格式
    eclipse修改文件编码
    eclipse代码格式化设置
    批量修改Java类文件中引入的package包路径
    Oracle 创建用户
    电脑端口介绍
    Python Web 性能和压力测试 multi-mechanize
    C++使用ocilib访问oracle数据库
    IPython使用学习笔记
    .NET Core与.NET Framework、Mono之间的关系
  • 原文地址:https://www.cnblogs.com/silyvin/p/9106879.html
Copyright © 2011-2022 走看看