C Programming - Pointers - Discussion

Discussion Forum : Pointers - Find Output of Program (Q.No. 1)
1.
What will be the output of the program ?
#include<stdio.h>

int main()
{
    static char *s[] = {"black", "white", "pink", "violet"};
    char **ptr[] = {s+3, s+2, s+1, s}, ***p;
    p = ptr;
    ++p;
    printf("%s", **p+1);
    return 0;
}
ink
ack
ite
let
Answer: Option
Explanation:
No answer description is available. Let's discuss.
Discussion:
110 comments Page 2 of 11.

Chakshu arora said:   8 years ago
Let starting address for black=1000, white=2000, pink=3000, violet=4000
then s will be a array of [1000, 2000, 3000, 4000] and let its starting address to 5000 which will contain 1000, next 5004 which will contain 2000 and so on.

ptr will be array of address stored in s as [5012(s+3= 5000+3*4(size of pointer)), 5008, 5004, 5000] and let its starting address be [6000,6004,6008,6012]
now p = 6000
++p= 6004
**p+1= **6004+1 =*5008+1 = 3000+1 =3001( as it array of characters)
3001=i (in pink).

%s will start printing from i untill null occurs.
(1)

AKSHAY KALRA said:   9 years ago
static char *s[] = {"black", "white", "pink", "violet"};

It means --> s[0] = "black" s[1] = "white" s[2] = "pink" s[3] = "violet"

char **ptr[] = {s+3, s+2, s+1, s}, ***p;

It means --> ptr[0] = s+3 ptr[1] = s+2 ptr[2] = s+1 ptr[3] = s

And, p = ptr --> &(s+3)

Now ++p;

That means p = p+1 --> ptr+1 --> &(s+2)

Now *p ---> s+3
**p ---> *(s+3) --> s[3] --> "pink"
**p+1 --> "ink".

AKSHAY KALRA said:   6 years ago
@Alok.

s is an array of character pointer.
s[0] = "black" s[1] = "white" s[2] = "pink" s[3] = "violet"

ptr is an array of pointer to character pointer.
ptr[0] = s+1 ptr[1] = s ptr[2] = s+3 ptr[3] = s+2

p is a pointer to pointer to character pointer.
p = ptr

Now try to understand this
*(*(*++p+1))+3)

first ++p will execute and now p = ptr+1
And *p = ptr[1]

*(*(ptr[1]+1))+3)
*(*(s+1))+3)
*(s[1])+3)
*("white")+3
'w'+3
'z'

Venkatanarayana pamidi said:   1 decade ago
This is a 2D array: static char*s[] = {"black", "white", "pink", "violet"};

This is an array of char**: char**ptr[] = {s+3, s+2, s+1, s} with first element at "violet".

p = ptr;

This will increment the pointer, in this case it will increment by 1 to the next array element i.e. pink: ++p;

This one has operator precedence also mixed with ++, so, it is actually (**p) + 1, remember all strings are NULL terminated, so it will print "pink" from "i" or "ink: printf ("%s", **p+1);

LOÏS said:   9 years ago
When one write char ***p; p is adress of an array of char;
i.e:
char *s[]={"white", "pink", "violet", "black"}; // s is an array of char who is equal to char **s.

If you want a pointer to point on that array you will declare it as char ***ptr=&s and then:
ptr--->&s;--->@@white
*ptr---->s;--->@white
**ptr---->*s--->white
**ptr+1--->*s+1--->hite

Now look at Akshay Kalra concept, it's very clear.

Murthy said:   1 decade ago
s is a character pointer.

s[]:

s[0]=black.
s[1]=white.
s[2]=pink.
s[3]=violet.

ptr[]:

ptr[0]=violet.
ptr[1]=pink.
ptr[2]=white.
ptr[3]=black.

Here p=ptr i.e p, ptr are the same address.

++p is equal to ++ptr that means pink. For these p++ ia added the +1 that means ++p+1 that is **p+1 means ink.

Adeel said:   1 decade ago
ptr = {pointer to "violet", pointer to "pink", pointer to "white", pointer to "black"}

p = ptr --> *p = pointer to "violet"

++p --> *p = pointer to "pink"

This implies that:

*p = {'p','i','n','k','\0'}

Which means:

**p = 'p'
**p + 1 = 'i'

so **p + 1 is a pointer to this string: {'i', 'n', 'k', '\0'}, which is simply "ink"
(3)

Pranav said:   1 decade ago
ptr = {pointer to "violet", pointer to "pink", pointer to "white", pointer to "black"}

p = ptr --> *p = pointer to "violet"

++p --> *p = pointer to "pink"

This implies that:

*p = {'p','i','n','k','\0'}

Which means:

**p = 'p'
**p + 1 = 'i'

so **p + 1 is a pointer to this string: {'i', 'n', 'k', '\0'}, which is simply "ink"

Thirum said:   1 decade ago
*s[] = {"black", "white", "pink", "violet"};
ptr = {"violet","pink","white","black"};

p = ptr;// means "violet"

++p ;//means "pink"
printf("%s", **p+1);//**p+1 point to "i" of pink so it will print "ink"

So ink is output

Which is simply "ink".

Vamshi said:   1 decade ago
1. s is an array of 4 colors where s having starting address of black, s+1 having starting address of white and so on.

2. ptr is an array of the starting addresses and p is pointer to ptr array.

3. ++p means at p+1 location s+2 is stored. **p means pink and **p+1 means address of alphabet "i" in pink. then it prints the string from i to end of the string.


Post your comments here:

Your comments will be displayed after verification.