A veces el tema de los punteros en c se puede convertir en una pesadilla, pero lo cierto es que no es tan complicado teniendo las ideas claras.
En ocasiones...
Para empezar, un array de caracteres que se pasa como argumento a una función, no es un paso de parametro por valor, y si se modifica, al retornar de la función los cambios estarán ahí.
Y en el caso de un swap de enteros, se pasan los parametros por referencia con el operador &. En una entrada anterior en el codeblog puse un swap de cadenas muy complicado, creo que este es más elegante.
/**
* swap.c
* Implementa dos versiónes de la función swap, una para intercambiar enteros
* y la otra para intercambiar arrays
* Compilacion: gcc -o swap swap.c
*
* Pello Xabier Altadill Izura
*/

#include <stdio.h>


void swap(int *px, int *py);
void swaps(char a[], char b[]);

main ()
{
     int valor1 = 666;
     int valor2 = -34;
     char cadena1[] = "Esta es la primera cadena";
     char cadena2[] = "Esta es la segunda cadena";

     printf("Antes: valor1:%d  y valor2: %d
", valor1, valor2);
     /* Atención, los parametros deben ser las direcciones */
     swap(&valor1, &valor2);
     printf("Despues: valor1:%d  y valor2: %d
", valor1, valor2);

     printf("Antes: cadena1:%s  y cadena2: %s
", cadena1, cadena2);
     /* Atención, los parametros deben ser las direcciones */
     swaps(cadena1, cadena2);
     printf("Despues: cadena1:%s  y cadena2: %s
", cadena1, cadena2);



}

/* Implementación de SWAP */
void swap (int *px, int *py)
{
     int tmp;

     tmp = *px;
     *px = *py;
     *py = tmp;
}

/* Implementacion de swaps */
void swaps(char a[], char b[])
{
     int i;
     char tmp[2048];

     /* En el mismo array vamos asignando */
     for (i=0;(tmp[i]=a[i]) != '';i++);

     /* Y despues le metemos el final */
     tmp[i]='';

     for (i=0;(a[i]=b[i]) != '';i++);

     /* Y despues le metemos el final */
     a[i]='';

     for (i=0;(b[i]=tmp[i]) != '';i++);

     /* Y despues le metemos el final */
     b[i]='';

}