This comes down to fact that there are multiple ways of accessing memory on the S12X. For flash you have PPAGE, for RAM you have RPAGE and for EEPROM you have EPAGE and for all three you also have the alternative of using GPAGE. Depending on the circumstances one may be more efficient than the other so CodeWarrior gives a choice of how to access memory.
Basically you define the type of access used by a pointer in its declaration and the compiler will use that type of access from then on and so you can just get on and write C.
If you define a pointer with __pptr you will use PPAGE to access that memory. If you use far then you will use GPAGE. PPAGEs are 16k in size and apply only to the flash range 0x8000 to 0xBFFF and GPAGEs are 64k and applies to the entire 8Mb memory map. This explains why you have different addresses for the same memory location - one uses PPAGE page addresses and the other uses GPAGE page addresses.
In your example flash page 0xFE is a PPAGE value which corresponds to part of GPAGE (far) address of 0x7Fxxxx.
This can be confusing the first time you meet it but there is lots of supporting material and if you understand the approach you can write very efficient and small code.
Have a look at the memory map utility included with CodeWarrior. Find it in the /prog folder or as a component of the debugger: it's called hcs12xadrmap.exe. It allows you to translate between the different memory addresses.
For more background on the memory mapping on the part read AN2615 and AN2734. There were some training presentations from FTF last year which I can't find on the web right now but AAR112 is the number.
Of course if you always have the option of just using one approach and then all the pointers will behave in the same way using the same memory map.