Sunday, January 22, 2012

C pointer Questions

1.int main( )
{
  int a[2][3][2] = {{{2,4},{7,8},{3,4}},{{2,2},{2,3},{3,4}}};
  printf(“%u %u %u %d \n”,a,*a,**a,***a);
  printf(“%u %u %u %d \n”,a+1,*a+1,**a+1,***a+1);
 }
Output:100, 100, 100, 2
114, 104, 102, 3
Explanation:
The given array is a 3-D one. It can also be viewed as a 1-D array.
                                                                                                                           
     2       4      7      8     3       4      2     2       2       3       3       4
   100   102  104  106 108   110  112  114  116   118   120   122
thus,   for   the  first  printf  statement  a,  *a,  **a   give address of     first
element  . since the indirection ***a gives the value. Hence,  the first
line of the output.
for the second printf a+1 increases in the third dimension thus points to
value at 114, *a+1 increments in second dimension thus points to 104,
**a +1 increments the first dimension thus points to 102 and ***a+1
first gets the value at first location and then increments it by 1. Hence,
the output.

2. main( )
{
 static int  a[ ]   = {0,1,2,3,4};
 int  *p[ ] = {a,a+1,a+2,a+3,a+4};
 int  **ptr =  p;
 ptr++;
 printf(“\n %d  %d  %d”, ptr-p, *ptr-a, **ptr);
 *ptr++;
 printf(“\n %d  %d  %d”, ptr-p, *ptr-a, **ptr);
 *++ptr;
 printf(“\n %d  %d  %d”, ptr-p, *ptr-a, **ptr);
 ++*ptr;
 printf(“\n %d  %d  %d”, ptr-p, *ptr-a, **ptr);
}
Output:
111
222
333
344
Explanation:Let us consider the array and the two pointers with some address
a
     0          1          2          3         4
   100      102      104      106      108
p
    100      102      104      106      108
   1000    1002    1004    1006    1008
ptr
1000 --value
2000-- address
After execution of the instruction ptr++ value in ptr becomes 1002, if
scaling  factor   for   integer   is  2 bytes.  Now ptr  – p  is  value  in ptr  –
starting location of array p, (1002 – 1000) / (scaling factor) = 1,  *ptr –
a = value at address pointed by ptr – starting value of array a, 1002 has
a value 102   so the value is (102 – 100)/(scaling factor) = 1,   **ptr is
the value stored in the location pointed by   the pointer of ptr = value
pointed by value pointed by 1002 = value pointed by 102 = 1. Hence
the output of the firs printf is  1, 1, 1.
After   execution of  *ptr++  increments  value  of   the  value   in ptr  by
scaling factor,  so it becomes1004.  Hence,  the outputs for the second
printf are ptr – p = 2, *ptr – a = 2, **ptr = 2.
After   execution of  *++ptr   increments  value  of   the  value   in ptr  by
scaling  factor,   so  it  becomes1004.  Hence,   the outputs   for   the   third
printf are ptr – p = 3, *ptr – a = 3, **ptr = 3.
After  execution of  ++*ptr  value  in ptr   remains  the same,   the value
pointed by the value is incremented by the scaling factor. So the value
in array p at   location 1006 changes   from 106 10 108,.  Hence,   the
outputs for the fourth printf are ptr – p = 1006 – 1000 = 3, *ptr – a =
108 – 100 = 4, **ptr = 4.

No comments:

Post a Comment