C核心技术手册(三十三)

翻译 2011年01月23日 19:40:00

4.2.4 指针和整型之前的转换

  你可以显式地将指针转换为整数类型,反之亦然。此种转换的结果由编译器决定,且与编译器所运行的系统的地址结构有关。指针和整数类型的转换在系统编程中很有用,当程序访问物理地址(例如:ROMI/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型常量初始化。

相关文章推荐

C核心技术手册(三十九)

多个源文件的编译
  • dyx1024
  • dyx1024
  • 2011年04月20日 00:11
  • 819

C核心技术手册(二十二)

字符常量
  • dyx1024
  • dyx1024
  • 2011年01月04日 22:14
  • 901

C核心技术手册(四十四)

GCC 编译 优化
  • dyx1024
  • dyx1024
  • 2011年05月03日 23:45
  • 869

C核心技术手册(二十一)

浮点常量可被写为十进制或十六进制
  • dyx1024
  • dyx1024
  • 2011年01月03日 23:53
  • 625

C核心技术手册(三十八)

连接
  • dyx1024
  • dyx1024
  • 2011年04月19日 00:10
  • 909

C核心技术手册(二十七)

算术类型转换结果(_Bool类型转换 和 无符号整型转换)
  • dyx1024
  • dyx1024
  • 2011年01月17日 00:06
  • 656

C核心技术手册(三十)

显式指针转换(对象指针、函数指针)
  • dyx1024
  • dyx1024
  • 2011年01月23日 18:39
  • 648

C核心技术手册(二十三)

字符串常量
  • dyx1024
  • dyx1024
  • 2011年01月08日 00:01
  • 2224

C核心技术手册(三十四)

表达式求值、左值
  • dyx1024
  • dyx1024
  • 2011年02月13日 00:06
  • 803

C核心技术手册(二十九)

非算术类型转换(数组和函数操作指示符)
  • dyx1024
  • dyx1024
  • 2011年01月21日 23:37
  • 822
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C核心技术手册(三十三)
举报原因:
原因补充:

(最多只允许输入30个字)