您的位置:首页 > 其它

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

2013-11-26 10:24 183 查看
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逃避类型检查。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: