The execution of prefix increments / decomposition and pointer derefections comes from the variable name to the left, and A [i] is equivalent to * (A + i), therefore, without additional parentheses, the array element will be accessed first through square brackets. And for the same reason, the record i [A] is absolutely valid, you can try to write like this on the control: D
Now for your code:
printf("%s", **++cpp);
pointer cfp is incremented by 1, and points to c + 2, c + 2 is an element of the array with index 2 (remember that the counting starts from zero) dereference it with two asterisks, and we get the string "POINT".
printf("%s", *--*++cpp+3);
here, cfp is again increased by 1, and starts pointing to c + 1, then we dereference it 1 time, now our piece of expression points to "NEW" already in the c array (the cp array contains only copies of pointers to different parts of c), obtained from +1 decrementing, we get with, dereferencing again, we get the string "ENTER", and only now adding to this line (that is, to the pointer to its zero element) triples, that is, the beginning of the line is shifted by 3 and it turns out "ER"
printf(" %s", *cpp[-2]+3);
first, we refer to cpr [-2], that is, it was c + 1, it became c + 3, and a dereferencing by one level occurred, cpr [-2] is equivalent to * (cpr-2), dereference again, we get the string " FIRST ", shift its beginning by 3 characters and get" ST "
printf("%s", cpp[-1][-1]+1);
remember that cfp is still equal to c + 1, and then the first brackets give us c + 2, and the second give us the string "NEW", increase its beginning by 1, and it turns out "EW".