指针所占内存剖析

来源:互联网 发布:黑客帝国1重访矩阵 编辑:程序博客网 时间:2024/05/02 00:55

指针的长度并非跟计算机字长有关,准确地说,是跟段大小和编译模式有关。你所看到的16位cpu指针两个字节、32位cpu指针四个字节其实是一种错觉。

指针所指向的实体,无非在_code、_data、_bss、const和stack段,指针的值是这些段的段内偏移,段内偏移结合段寄存器的段值(实模式)或者段描述符(保护模式)构成实际的物理地址。VC等编译器工作在保护模式,在保护模式中,一个段最大可以是4G,其偏移量由32位表示,因此VC的指针是四个字节;而tc2.0等编译器工作在实模式,一个段最大64k,偏移量以16位表示,因此在mini、small、medium三种模式下,tc2.0的指针通常是两个字节,运行在windows中的tc2.0工作在虚拟8086模式,这个模式通过分页把tc2.0的工作空间映射回实模式使用的第一个1M内存,段大小仍然是64k,因此指针大小仍然是16位,但是,有一点不同的是,工作在compact、lardge和huge模式的指针,默认是包含16位的段值的,因此这三个模式下的指针,默认是四个字节的,当然,在mini、small和medium模式中也可以使用包含段值的指针,tc2.0的非标准扩展关键字far和huge就是起到这个作用,使用far和huge修饰的指针例如char huge*p;其长度为四个字节。

简言之:
指针就是一个整数。
指针,是一个无符号整数(unsigned int,下简写为int),它是一个以当前系统寻址范围为取值范围的整数。32 位系统下寻址能力(地址空间)是4G-bit(0~232-1)二进制表示长度为32bit,也就是4Byte。 int类型也正好如此取值

原创粉丝点击