near 和 far指针
如果动态创建的数据量比较大,用一个数据段(一般是64K,此时段指针不变,偏移量指针在16bit内变化)放不下的时候,需要重新开辟一个数据段供存放更多的数据,此时称原来的堆部分为近堆,改变段地址后的新的数据段所在的堆部分称为远堆。
PC机的存储器地址是由段地址和偏移地址组合而成,每一段不能超过64k字节地址,因而统一个段内的地址存取,即段内寻址,用偏移地址就可以实现,所以段地址寄存器所存的段地址是不变。当用指针时,只16位即4个字节就够了,这一类就是near指针。当要在另一个段内取数据,就要跨段,即要指明存取段的段地址和偏移地址,这时段地址寄存器所存段地址要改变,在使用指针指向另一个段内地址时,就要用32位表示,就是far指针了。
由于dos是16位的操作系统,故程序代码受到segment的限制,near指针最多只能指向64k以内的代码或数据。而far指针则可以跨段寻址,还有huge类型的远指针。但是由于watcom,djgpp等dos下的编译器,以及所有windows下的编译器都是32位的,没有 64k的限制,指针也就不分远近了。
如果动态创建的数据量比较大,用一个数据段(一般是64K,此时段指针不变,偏移量指针在16bit内变化)放不下的时候,需要重新开辟一个数据段供存放更多的数据,此时称原来的堆部分为近堆,改变段地址后的新的数据段所在的堆部分称为远堆。
PC机的存储器地址是由段地址和偏移地址组合而成,每一段不能超过64k字节地址,因而统一个段内的地址存取,即段内寻址,用偏移地址就可以实现,所以段地址寄存器所存的段地址是不变。当用指针时,只16位即4个字节就够了,这一类就是near指针。当要在另一个段内取数据,就要跨段,即要指明存取段的段地址和偏移地址,这时段地址寄存器所存段地址要改变,在使用指针指向另一个段内地址时,就要用32位表示,就是far指针了。
由于dos是16位的操作系统,故程序代码受到segment的限制,near指针最多只能指向64k以内的代码或数据。而far指针则可以跨段寻址,还有huge类型的远指针。但是由于watcom,djgpp等dos下的编译器,以及所有windows下的编译器都是32位的,没有 64k的限制,指针也就不分远近了。