In the send function you are de-referencing the pointer S (the * operator) and then adding the value of n to it. The value of *S, in your example, is 0 so your program is printing 0 + the value of n as you iterate over the loop. if you used brackets: *(S + n) you would print the values of the array. As you can likely see in your Recieve function (%p tells the compiler you wish to print the value of the pointer P+n) the compiler adds to the pointer the size of int on your system.
You mention registers but what you really mean is memory locations. Your compiler may put them into registers but that's its business not yours.
To access the data addressed by P you can either use array syntax P[n] or pointer syntax *(P + n) but you will also need to use the specifier for an int in your printf statement (%d). As I mention %p asks for the value of the pointer itself, not what it points to.
-Greg.