经常在windows的头文件中见到 类似一下类型重定义:
typedef BOOL near *PBOOL;
typedef BOOL far *LPBOOL;
typedef BYTE near *PBYTE;
typedef BYTE far *LPBYTE;
typedef int near *PINT;
typedef int far *LPINT;
typedef WORD near *PWORD;
typedef WORD far *LPWORD;
typedef long far *LPLONG;
typedef DWORD near *PDWORD;
typedef DWORD far *LPDWORD;
typedef void far *LPVOID;
好奇的是为什么在类型和指针之间加上far 或者 near?
参考 https://www.cnblogs.com/littlepear/p/5933649.html
首先转到far 和near的定义,
发现二者是配套使用的,需同时存在:
在16位Windows中,内存是分段的,所以指针分为两类:FAR指针和NEAR指针。FAR表示指示的是另外一个段或者说全局地址,NEAR表示指示的是本段内部的地址。
到了Win32中,采用虚拟内存,认为内存是平坦的,线性的,等到链接阶段进行符号重定位时才会把真正的地址映射到物理内存地址空间,具有32位的线性地址,没有分段的概念了,但是为了照顾Win16程序员的习惯,FAR和NEAR都被保留了下来,但是它们的意思是一样的,都表示指针(其实不使用它们也可以)。
还有Win32中的LP(Long Pointer)中的L(Long)也是一样的道理。
16位的寻址空间为 64KB,所以有near,far之称
32位的寻址空间为 4GB,地址非常平坦,无near,far
首先这里的far,在32位系统已经废除不用了。它是C/C++语言在16位系统中用以标明指针是个远指针的修饰符。
远指针是说指针所指向的地址已经超出了64K(2的十六次方),所以需要使用DS加偏移量的方法来寻址,而不能直接寻址。其反义的修饰符是near。
举例:
int far fptr;
fptr=(int far)0xb0000000;
16位PC机的存储器地址是由段地址和偏移地址组合而成,每一段不能超过64k字节地址,因而同一个段内的地址存取,用偏移地址就可以实现,因段地址寄存器所存的段地址是不变的。当用指针时,只16位就够了,这一类就是near指针。当要在另一个段内取数据,就要跨越段,即要指明存取段的段地址和偏移地址,这时段地址寄存器所存段地址要改变,在使用指针指向另一个段内地址时,就要用32位表示,就是far指针了。由此可见,如果你想写在Win16上也能运行的程序,才会涉及到newr、far指针的概念。在Win32上,指针已无near、far的区分。