$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$