你可以显式地将指针转换为整数类型,反之亦然。此种转换的结果由编译器决定,且与编译器所运行的系统的地址结构有关。指针和整数类型的转换在系统编程中很有用,当程序访问物理地址(例如:ROM、I/O寄存器等)时也会使用。
当你将指针转换为一个取值范围没有指针所表示值大的整数类型时,结果是不可定义的,相反地,转换一个整数为指针类型没有必要必须产生一个有效指针,例如:
float x = 1.5F, *fPtr = &x; // A float, and a pointer to it.
unsigned int adr_val = (unsigned int)fPtr; // Save the pointer value
// as an integer.
/*
* On an Intel x86 PC in DOS, the BIOS data block begins at the
* address 0x0040:0000.
* (Compile using DOS's "large" memory model.)
*/
unsigned short *biosPtr = (unsigned short *) 0x400000L;
unsigned short com1_io = *biosPtr; // The first word contains the
// I/O address of COM1.
printf( "COM1 has the I/O base address %Xh./n", com1_io );
最后三条语句从系统配置表中读取出硬件信息,假设操作环境允许程序访问内存区,在一个大内存模式下编译的DOS程序中,指针具有32位宽度,在高16位中包含一个段地址和一人低16位的偏移量(通常以segment:offset的形式表示),因而前的biosPtr指针可以使用一个long int型常量初始化。