Friday, 24 January 2014

C - Pointers

Pointers:
·         Pointers are variables that contain memory addresses and are used to access the data stored in the memory.
·         Pointers are used to return the multiple values from a function via arguments .
·         Each location has a unique address .
Example :
int x ;
x = 10;
int *ptr;  /*    *ptr is a pointer variable pointing to an integer value */
·         “*” indicates that pointer variable ‘ptr’ contains address of variables .
·         The address should contain only integer type values .
ptr = &x;
            [&x is used to get the address]
Eg :
printf(“%d” , *ptr);
printf(“%d”, ptr);
printf(“%d”, &ptr);
Here , *ptr tells that the variable is a pointer .
·         Ptr tells the name of memory location and points to a variable .
·         &ptr tells us the address of variable .
POINTERS AND ARRAYS :
·         An Array name can be assigned to the pointer variable, because it contains the address of the first element.
·         When an array is declared the compiler allocates certain base address and storage in memory locations .
·         The base address is the location of the first element in an array .
·         For example : int x[5] = {1,2,3,4,5};
·         An array ‘x’ with size of 5 elements is declared and will be stored as follows .
·         Let us assume that the base address of ‘x’ is 100 then  , the remaining elements will be stored as follows :
 x =& x [1] = 1000+1 (no.of bytes required by    
                             the ‘int’ type )
                         = 1000+ 1(2) = 1002
If we declare ‘p’ as an integer pointer , as
int  *p;
p = x is equal to
p = & x [0]; ð p=& x [0] = 1000
                        P= & x [1] = 1002
                        P= & x [2]= 1004
                         P=& x [3] = 1006
                         P = & x [4] = 1008
POINTERS AND CHARACTERS :
·         Strings can be treated as character arrays .
·         The compiler automatically inserts the null character ‘\0’ at the end of the string .
·         Strings can be created using pointer variables .
Eg : char* str = “apple” ;
 Now , the string “apple” is stored as
·         The pointer ‘str’ points towards the first character  .  Assignment operator is used for giving values  .
 char *string1;
 String1 = “apple “;
·         The above statement is not a string copy because the variable ‘string1’ is a pointer not a stiring .
POINTERS AS FUNCTION ARGUMENTS :
·         We can pass the address of a variable as an argument to a function in the normal fashion.
·         When we pass addresses to a function ,  the parameters receiving the addresses should be pointers . the process of calling a function using pointers to pass the address of variables is known as “call by reference” .
·         The function which is called by ‘reference’ can change the value of the variable used in the call .
Consider the following code :
Main()
{
     int x ;
     x=20;
     change(&x);  /*call by reference or address*/
     printf(“%d\n”, x);
}
Change(int  *p)
{
*p = *p + 10 ;
}
·         When the function change() is called , the address of the variable x is passed into the function change() . Inside change() , the variable p is declared as a pointer and therefore p is the address of variable x .
·         Thus , call by reference provides a mechanism by which the function can change the stored values in the calling function .
·         Note that this mechanism is also known as “call by address” or “pass by pointers” .
·         Rules :
1)      The function parameters are declared as pointers .
2)      The dereferenced pointers are used in the function body.
3)      When the function is called the addresses are passed as actual arguments .
FUNCTION RETURNING POINTERS :
We can force a function to return a pointer to the calling function . consider the following code :
int *larger (int * , int *); /*prototype*/
main ( )
{     
  Int a = 10;
  Int b = 20;
  Int *p;
  p = larger (&a , &b);
  printf (“%d”, *p);     /*function call */
}
int *larger (int *x , int *y)
{
    if (*x>*y)
             return (x);   /*address of a */
    else
             return (y);   /*address of b */
}
·         The function larger receives the addresss of the variable a and b , decides which one is larger using the pointers x and y and then returns the address of its location . The returned value is then assigned to the pointer variable p in the calling function . In this case , the address of b is returned and assigned to p and therefore the output will be the value of b , namely 20 .
·         The address returned must be the address of a variable in the calling function.

POINTERS TO FUNCTIONS :
·         A function , lke a variable , has a type and an address location in the memory . It is therefore , possible to declare a pointer to a function , which can be used as an argument in another function .
·         A pointer to a function is declared as follows :
              type (*fptr)  ();
·         This tells the compiler that fptr is a pointer to a function , which returns type value . the value parentheses around *fptr are necessary . remember that a statement like
                 type *gptr();
·         Would declare gptr as a function returning a pointer to type
·         We can make a function pointer to point to a specific function by simply assigning the name of the function to the pointer . for example , the statements
                double mul(int, int);
                double (*p1) ();
                 p1 = mul;
·         Declare p1 as a pointer to a function and mul as a function and then make p1 to point to the function mul. To call the function mul , we may now use the pointer p1 with the list of parameters. That is ,
               (*p1)(x,y)  /*function call*/
Is equivalent to
                    mul(x,y);
POINTERS AND STRUCTURES :
The name of a structure stands for the addresses of the 0th element . consider the following declaration :
                      struct inventory
                      {
                               Char   name[30];
                                Int   number ;
                                Float price ;
                        }  product [2] ,   *ptr ;
Its members can be accesed using the following notation
            Ptr->name
             Ptr->number
             Ptr->price
The symbol ‘->’ is called arrow operator ( also known as “member selection operator”). Ptr -> is simply another way of writing product[0].
POINTER TO STRUCTURE VARIABLES :
While using structure pointers , we should take care of the precedence of operators . the operators ‘->’ and ‘.’ And () [] have the highest priority among operators. They bind very tightly with their operands . for example
 Struct
{
                  Int count ;     /*pointer inside the struct*/
                  Float  *p ;      /*struct type pointer*/
 }  *ptr ;
Then the statement
                  ++ptr -> count ;
Increments the count not ptr. However
                  (++ptr)  -> count ;
Is legal and increments ptr after accessing count .
The following statements also behave similarly ,
*ptr ->p        fetches whatever p points to
*ptr->p++     increments p after accessing whatever it points to
(*ptr->p)++          increments whatever p points to
*ptr++->p            increments ptr after accessing whatever it
                               points to

No comments:

Post a Comment