指针的长度并非跟计算机字长有关,准确地说,是跟段大小和编译模式有关。你所看到的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;其长度为四个字节。
摘自网上的一段原话!保存了很久。