Far Pointer in C Programming

The Pointer which can point or access whole the residence memory of RAM i.e. which can access all 16 segments is known as far Pointer.

Far Pointer:-

(If you don’t know what is segment the click here)
Size of far Pointer is 4 byte or 32 bit.

Examples:

(1) What will be output of following c program?



            
#include<stdio.h>
int main()
{
   int x=10;
   int far *ptr;
   ptr=&x;
   printf("%d",sizeof ptr);
   return 0;
}
                                                                                             


 Output:- 4


(2)What will be output of following c program?



 #include<stdio.h>
int main()
{
     int far *near*ptr;
    printf("%d %d",sizeof(ptr) ,sizeof(*ptr));
    return 0;
}
                                                                                                
 


                                  
Output:- 4 2


Explanation: ptr is far pointer while *ptr is near pointer.

(3)What will be output of following c program?



          
#include<stdio.h>
int main()
{
    int far *p,far *q;
   printf("%d %d",sizeof(p) ,sizeof(q));
   return 0;

}
                                                                                                



              
Output:- 4 4                   
First 16 bit stores: Segment number
Next 16 bit stores: Offset address

What is segment number and offset address?

Example:-



   
#include<stdio.h>
int main()
{
     int x=100;
     int far *ptr;
     ptr=&x;
     printf("%Fp",ptr);
    return 0;
}
                                                                                                       


                                    
Output: -8FD8:FFF4


Here 8FD8 is segment address and FFF4 is offset address in hexadecimal number format. %Fp is used for print offset and segment address of pointer in printf function in hexadecimal number format.In the header file dos.h there are three macro functions to get the offset address and segment address from far pointer and vice versa.

1. FP_OFF(): To get offset address from far address.

2. FP_SEG(): To get segment address from far address.

3. MK_FP(): To make far address from segment and offset address.

Examples:

(1)What will be output of following c program?



#include <dos.h>
#include<stdio.h>
int main()
{
    int i=25;
   int far*ptr=&i;
   printf("%X %X",FP_SEG(ptr),FP_OFF(ptr));
   return 0;
}
                                                                                                     




Output: Any segment and offset address in hexadecimal number format respectively.                       

(2)What will be output of following c program?



                 
#include <dos.h>
#include<stdio.h>
int main()
{
     int i=25;
    int far*ptr=&i;
    unsigned int s,o;
    s=FP_SEG(ptr);
    o=FP_OFF(ptr);
    printf("%Fp",MK_FP(s,o));
    return 0;

}
                                                                                      




Output: 8FD9:FFF4 (Assume)                        

We cannot guess what will offset address, segment address and far address of any far pointer. These address are decided by operating system.

Limitation of the far pointers:

We cannot change or modify the segment address of given far address by applying any arithmetic operation on it. That is by using arithmetic operator we cannot jump from one segment to other segments. If you will increment the far address beyond the maximum value of its offset address instead of incrementing segment address, it will repeat its offset address in cyclic order.

0 comments:

Post a Comment

Don't Forget to comment