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.
{
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