类型转换是一种基本操作,跟指针结合使用时很有用。转换指针对我们大有帮助,原因包括:
- 访问有特殊目的的地址;
- 分配一个地址来表示端口;
- 判断机器的字节序。
我们也会处理一个跟8.2.1节中的类型转换紧密相关的主题。
注意 机器的字节序一般是指数据类型内部的字节顺序。两种常见的字节序是小字节序和大字节序。小字节序是指将低位字节存储在低地址中,而大字节序是指将高位字节存储在低地址中。
我们可以把整数转换成整数指针,如下所示:
int num = 8;
int *pi = (int*)num;
不过,一般来说这不是好实践,因为它允许你访问任意地址,包括系统不允许程序访问的位置。图8-1说明了这一点,地址8不在应用程序的地址空间内,如果解引指针,一般就会导致应用程序终止。
有些情况下,比如我们需要寻址内存地址0,就可能需要把指针转换成整数,然后再转换回指针,这在老式的系统上比较常见,其指针长度和整数长度相同。不过,有时候这样不能正常工作。下面说明了这种方法,输出跟实现相关:
pi = #
printf("Before: %p\n",pi);
int tmp = (int)pi;
pi = (int*)tmp;
printf("After: %p\n",pi);
把指针转换为整数再转换回指针从来就不是什么好办法,如果确实需要这么做,考虑用联合体。
记住在指针与整数之间来回转换和在指针与void
指针之间来回转换不同,1.1.8节中的“void指针”部分有说明。
注意 有时候容易将句柄和指针搞混。句柄是系统资源的引用,对资源的访问通过句柄实现。不过,句柄一般不提供对资源的直接访问,指针则包含了资源的地址。