The C standard allows pointers to different types to have different sizes, e.g. sizeof(char*) != sizeof(int*) is permitted. It does, however, require that if a
Near and far pointers are still used on some embedded microcontrollers with paged flash or RAM, to allow you to point to data in the same page (near pointer), or another page (far pointer, which is larger because it includes page information).
For example, Freescale's HCS12 microcontroller uses a 16-bit Von Neumann architecture, which means that no address can be more than 16 bits. Because of the limitation this would put on the amount of code space available, there is an 8-bit page register.
So to point to data in the same code page, you just specify the 16-bit address; this is a near pointer.
To point to data in another code page, you have to include both the 8-bit page number and the 16-bit address within that page, resulting in a 24-bit far pointer.