c - logic applied to pointer to string array -
i came across question in interview process. need understand logic behind 2nd output of program.
#include <stdio.h> char *c[] = {"geksquiz", "mcq", "test", "quiz"}; char **cp[] = {c+3, c+2, c+1, c}; char ***cpp = cp; int main() { printf("%s ", **++cpp); //1st statement printf("%s ", *--*++cpp+3); //2nd statement printf("%s ", *cpp[-2]+3); //3rd statement printf("%s ", cpp[-1][-1]+1); //4th statement return 0; }
output:- test squiz z cq
what understand above code:
for sake of simplicity can consider cp[]
{quiz test mcq geksquiz}
1st statement:
**++cpp
-> cpp
points base address of test
, dereferencing 2 times gives test
fine.
but in 2nd statement can't demystify logic:
*--*++cpp+3
-> ++cpp
points mcq
*++cpp
address of m
, --*++cpp
previous address m
, i'm stuck here. how it's getting squiz
output?
(afaik ++(suffix) , * have same precedence , right left associativity)
(disclaimer: please broaden mind. not codes meant product development. code evaluates understanding of c pointers)
after first printf
, cpp
pointing c+2
.
cp +------+ | | 0 | c+3 +----------------------------------------------------------------+ | | | | | | +------+ | | | | 1 | c+2 +-------------------------------------------------+ | cpp --------> | | | | | | | | +------+ | | | +---------------------------------------+ | | 2 | c+1 | | | | | | | | | | | | | | +------+ | | | | +-----------------------+ | | | 3 | c | v v v v | | | | +-------------+------------+-----------+------------+ +------+ c | "geksquiz" | "mcq" | "test" | "quiz" | | | | | | +-------------+------------+-----------+------------+ 0 1 2 3
in second printf
, ++cpp
increment cpp
c+1
.
*++cpp
dereference cpp
, give c+1
.
--
decrement c+1
1
therefore, *--*++cpp
give c
.
c+3
point 4th character of "geksquiz"
, i.e. s
.
note after second printf
cpp
point cp[0]
pointing c
now.
+------+ | | 0 | c+3 +----------------------------------------------------------------+ | | | | | | +------+ | | | | 1 | c+2 +-------------------------------------------------+ | | | | | | | | | +------+ | | | +-------------------------+ | | 2 | c | | | | cpp -------->| | | | | | | | | | +------+ | | | | +-----------------------+ | | | 3 | c | v v v v | | | | +-------------+------------+-----------+------------+ +------+ | "geksquiz" | "mcq" | "test" | "quiz" | | | | | | +-------------+------------+-----------+------------+ 0 1 2 3