@ollirz
hi :D
the memory of s looks similar to (i changed s to be of type char[3][10] for the memory view)
0x65fdf0: 0x6f 0x6e 0x65 0x00 0x00 0x00 0x00 0x00
0x65fdf8: 0x00 0x00 0x74 0x77 0x6f 0x00 0x00 0x00
0x65fe00: 0x00 0x00 0x00 0x00 0x74 0x68 0x72 0x65
0x65fe08: 0x65 0x00 0x00 0x00 0x00 0x00
after its initialization p points to the last element of s ("three"). You then output *p + *(p-1) - *p which equals *(p-1).
This is the symbol preceeding the first letter of the word "three", or the "t" - depending on evaluation order. (char)0 might be printed as whitespace.
Afterwards you pre-increment p, so it poinst to the second letter of the word "three", as string, the rest of the word will be printed
However it think this triggers implementation defined / undefined behavior since the evaluation order of parameters is not defined!
clang will output " hree" (left to right) where gcc will print "three" (right to left)