The Gateway to Computer Science Excellence
+41 votes

Which one of the choices given below would be printed when the following program is executed?        

#include <stdio.h>
int a1[] = {6, 7, 8, 18, 34, 67};
int a2[] = {23, 56, 28, 29};
int a3[] = {-12, 27, -31};
int *x[] = {a1, a2, a3};
void print(int *a[])
            printf("%d,", a[0][2]);
            printf("%d,", *a[2]);
            printf("%d,", *++a[0]);
            printf("%d,", *(++a)[0]);
            printf("%d\n", a[-1][+1]);

  1. $8, -12, 7, 23, 8$
  2. $8, 8, 7, 23, 7$
  3. $-12, -12, 27, -31, 23$
  4. $-12, -12, 27, -31, 56$
in Programming by Boss (16.3k points)
edited by | 3.2k views
at least mark my answer to tell whether it is correct or [email protected]

3 Answers

+88 votes
Best answer

$a = \{a1, a2, a3\};$

 printf("%d,", a[0][2]);

$a[0]$ is $a1$. So, this will print $a1[2] = 8;$

 printf("%d,", *a[2]);

$a[2]$ is $a3$. So, this will print $*a3 = a3[0] = -12 ([]$ has greater precedence than $*)$

 printf("%d,", *++a[0]);

$a[0]$ which is $a1$ is incremented. $a1$ is a pointer to int (base address of an integer array) and so increment means adding $sizeof(int)$ and hence $a1$ now points to the second element in the array. So, $*++a[0]$ prints second element of $a1$ which is $7$ and now $a1$ starts from $7$.

printf("%d,", *(++a)[0]);

$++a$ will increment $a$, which being a pointer (In C, an array when passed to a function becomes a pointer) to pointer (to int) will add $sizeof (pointer)$ to a. So, a now contains $\{a2, a3\}$ and $a[0]$ will be $a2$ and $*a2$ will be the first element in $a2$ which is $23$

printf("%d\n", a[-1][+1]);

$a[-1]$ will subtract a size of pointer from the base address of $a$. Normally this results in invalid memory access, but since we have incremented a previously, $a[-1]$ is valid and will point to $a1$. So, $a[-1][+1]$  will be $a1[1]$ which has the value $8$.
($a1$ was incremented in $3$rd printf and hence starts from $7$ and not $6$. $+1$ is same as $1$, just given to create confusion)

Correct Answer: $A$

by Veteran (431k points)
edited by
corerct explanation by Arjun
Can someone tell me? how last printf is working?
When we are at the  last statement i.e last  printf we are pointing to the location containing 7 now we have a[-1][1] . Now here we subtract one from the location of 7 and then we proceed . But according to this now the location points to a[0][1]=7 again plz correct me not able to understand how we point to  location of 8
a1 starts from 6 and you are printing a1[1] which is 7. What is the issue?
i got it sir
But as we passing base address of x from main to (int *a[])( which is array of pointer) in print function then a should point to x[] array. Why x is copy to *a[] like call in value ? because x is a base address of *x[]
@prachigupta ! Yes it's the same thing where argument print is declaring the fact that the function is expecting an array of pointers to integers and thus a is formal parameter which is also pointing to x only !
I cant understand the 4th print statement   "printf("%d,", *(++a)[0]);"

How can we increment an array? Isnt that illegal? I knew that any array variable is not supposed to be assigned. Could you pls explain?
Same doubt, is there a solution to above doubt?

    int i[]={-12, 27, -31};
    int z[]= {6, 7, 8, 18, 34, 67};
    int *q[]={i};
    int **x = ++q;

even this code is not working

How it is

a[0] is a1. So, this will print a1[2]=8??

@humblefool In C language when an array is passed to a function, it becomes a pointer.

@Arjun Sir For the last statement I have thought that a[-1][+1] , I added 1 to both , I get a[0][2] which is same as 8. Is this approach right sir ?

@sayan after incrementing Q ... which location Q is pointing ???
here a[-1][+1] means doing arithmetic operation on current pointer value.

In 4th printf 'a' is made to point a2. So a[-1] means 'a' is now pointing to the preceding element a1. Now at 3rd printf 'a' was made to point 7. So a[+1] means pointing to the successive element i.e  8.

a[-1] = current position - 1

a[+1] = current position + 1

Anyone,correct me if I'm wrong
"a1 was incremented in 3rd printf and hence starts from 7 and not 6"

Each time a pointer points to a previously accessed array, it points to the last pointed location? Please clarify :/
+11 votes
int *a[]=(a1,a2,a3};
    a is pointing to array a1
    if addition of 1 is performed with a,then it is pointing to next element in a i.e. a2
    a+1 is pointing to array a2
    a+2 is pointing to array a3
    *a is pointing to 0th element in  array a1
    if addition of 1 is performed with *a,then it is pointing to next element in a1
   *( a+1) is pointing to 0th element in array a2
   if addition of 1 is performed with *(a+1),then it is pointing to next element in a2
   *(a+2) is pointing to 0th element in array a3
1)a[0][2] = *(a[0]+2)=*(*(a+0)+2)
        a+0 is pointing to array  a1
       *(a+0) is pointing to 0th element in a1
       *(a+0)+2 is pointing to 2nd element in a1
       *(*(a+0)+2) is return the value of 2nd element in a1.      
First printf print 8

        a+2 is pointing to array a3
        *(a+2) is pointing to 0th element in a3
        *(*(a+2))  return the value of 0th element in a3.      
second  printf print -12


        a[0] is pointing to 0th element in a1
        ++a[o]  - after pre increment performed  a1={7,8,18,34,67} now a[0] is pointing to oth element in a1,
        *++a[0]  is return the value of oth element in a1.      
Third  printf print 7


  ++a - after pre increment performed a={a2,a3}
  (++a)[0]  is pointing to 0th element in a2
  *(++a)[0]  is return the value of oth element in a2.      
Fourth  printf print 23

        a-1 is  pointing to a1 // this portion of memory is valid if only that portion of memory is not allocated to other stack
       *(a-1) is is pointing to 0th element in a1
       *(a-1)+1 is  pointing to 1st  element in a1
        *(*(a-1)+1) is return the value of 1st element in a1 i.e 8.     because a1 was incremented in 3rd printf
Fourth  printf print 8
by (131 points)
well explained :)
Thank you
+4 votes

answer is 

8,-12,7,23,8, i.e option A


 a[0][2])=a-->a[0]-->a[0][2](way of understanding)=>a1[2]=8

and similarly for others as well.i can explain further if you are not getting it proper.

by Active (1.9k points)

sir, can u pls. xplain the last statement..i.e.....

 printf("%d\n", a[-1][+1]);


i am also in a perplexing situation here.i am working on it.

The way to do it would be to show the array address calculation.
here in last statement arjun i can see what -1 is doing but +1 should have made itself to the "7" of a1. you have any idea about this.??



was done on third printf


Related questions

Quick search syntax
tags tag:apple
author user:martin
title title:apple
content content:apple
exclude -tag:apple
force match +apple
views views:100
score score:10
answers answers:2
is accepted isaccepted:true
is closed isclosed:true
50,737 questions
57,354 answers
105,248 users