对于这个你只要记住一句秘诀就好,指针的大小仅仅取决指针本身的大小,不取决于指针指向的大小。 还有就是还有一个虚拟内存和物理地址的关系,有MMU映射,8086里有硬件完成一个地址偏移的过程,物理地址 = 基址*16 + 变址。
这段话好像是我之前写的.
那好吧,说说16位的指针.
十六位的寻址是段加偏移的方式来做的,段寄存器16位,偏移寄存器16位.
直接写 int * np;那么这是一个near指针,是十六位的
如果 int far *fp;那么这是一个far指针,是一个段寄存器16位和一个偏移16位,那么它的大小是4字节的.
另外,C编译器里还有一个 huge指针.也是32位的,但有效的好像只有20位.它的大小也是4字节的.
int huge *hp;
现在大家接触的多是32平的编译器,加上far 和huge这些关描述往往会报错,可以用TC2.0来试试.
32位windows内存地址采用平坦结构,内存地址都是32位整数,而指针变量的实质就是内存地址。所以,不管哪一种类型的指针变量都是4个字节大小。
能表示地址的字段大小在16位机上占两个字节,因此,能表示出来的有效地址只能是:2^16=64K
如果能使用64K以上的地址,那这个地址该如何表示呢?
你可以反汇编试试,好象会自动匹配.