If you call foo3("hi"), the first thing it does is look at the 'h' pointed to by the parameter x. Since that is non-zero, it calls foo3("i")--meaning that it passes the address of the rest of the string.
foo3("i") looks at the 'i', sees it's non-zero, and calls foo3("") -- technically it passes the address of the null terminator to the original string.
foo3("") looks at the null terminator, and returns.
foo3("i") prints the 'i' and returns.
foo3("hi") prints the 'h'.
The function works because it makes the recursive call before printing the "current character", so that the rest of the string will be printed before it.
cbaRather, it prints:c b a