union关键字和取类成员函数地址的方法

union关键字
union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有 相同的起始地址。例子如下:
union StateMachine
{
    char character;
    int number;
    char *str;
    double exp;
}addr;

特性:
1、所有数据成员中共享一个地址。

这个union中最长的变量类型是double,所以整个union占用的空间是double占用的空间。 sizeof (addr)返回8。即整个union的长度是8。

2、一个union变量只能有标识多个数据成员的一种。

addr.number输出是0,因为此时union空间里装的是double exp。实际上,number的输出是double exp的低位(小端)。

可以通过union做一些有趣的事。
1.大端小端的判断。
大端小段的判断,打印1就是小端。
#include <iostream>
using namespace std;
int main(){
    union{
        int a;
        char c;
    }addr;
    addr.a=1;
    cout<<(int)addr.c<<endl;
}

2.取类成员函数地址(取自Thunk技术的一部分)
    typedef void (_stdcall CButtonDemoBHO::*TMFP)();
        //union巧取成员变量地址
        union {
            unsigned int func;
            TMFP method;
        } addr;
        addr.method =(TMFP)&CButtonDemoBHO::pagescaner;
    union {
        unsigned int func;
        TMFP method;
    } addr;

这里addr.func的值就是类成员函数的地址。因为成员函数是一个独有的类型,不能强制转换,所以用union逃避类型检查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值