9.3.2 地址操纵
与大多数人的观点相反,C++(www.cppentry.com)语言定义并没有保证类型为void*的变量可以指向程序地址空间的任意位置。特别地,指向函数的指针就不能可移植地转化为void*:
- void g();
- int main(){
- void*q = (void*)g; //不可移植的
- //...
- }
只有在那些sizeof(void*)的大小足够容纳下函数指针的平台上,试图把函数指针转化为void*类型的操作才有可能是成功的。因此,对于一个包含这类转型的程序库,在某些平台或许可以正确地编译和执行,在另一些平台可能就会出现奇怪的行为,在其他一些平台也可能是不能编译的。
另外,某些程序员试图使用long类型的变量来存储和操纵内存地址,但这种做法也是不可移植的-long类型的大小也可能容纳不下一个指针。譬如,当下面的代码执行后:
- char x[10];
- long addr = (long)x;
- char* p = (char*)addr;
p并不一定指向x[0]。实际上,在大多数平台 中,p都不会指向x[0]。