From the C Standard (6.5.2.4 Postfix increment and decrement operators)
2 The result of the postfix ++ operator is the value of the
operand. As a side effect, the value of the operand object is
incremented (that is, the value 1 of the appropriate type is added to
it).
So using the post-increment operator you are calling recursively the function with the same values of the pointers.
This call
copy ( s1++, s2++ );
has the same effect as
copy ( s1, s2 );
++s1;
++s2;
Using the post-increment operator the function could be defined for example the following way.
void copy( const char *s1, char *s2 )
{
if ( ( *s2++ = *s1++ ) ) copy( s1, s2 );
}
As for the prefix increment operator then according to the C Standard (6.5.3.1 Prefix increment and decrement operators)
2 The value of the operand of the prefix ++ operator is incremented.
The result is the new value of the operand after incrementation.