Funkcja zamień na wskaźnikach

Proste ćwiczenie ze wskaźników.

#include <stdio.h>

// ------------------------------------
// funkcja pobiera adresy do dwóch komórek pamięci typu int
void zamien(int *ptrA, int *ptrB)
{

	// *ptrA oznacza zawartość komórki pamięci, którą przechowuje wskaźnik ptrA
	int tmp = *ptrA;
	*ptrA = *ptrB;
	*ptrB = tmp;
}

// ------------------------------------
int main(void)
{
	int a = 5;
	int b = 10;
	int tab[] = {4,2,5,1,2};
	
	// zamienia wartości zmiennych a i b
	// używamy operatora & który zwraca nam adres pamięci zmiennej a i b
	zamien(&a, &b);
	
	// zamienia elementy tabeli
	zamien(&tab[1], &tab[4]);
	
	

}

A może bardziej uniwersalną fukncję zamień na szablonach (c++)?
#include <stdio.h>

// ------------------------------------
template<class Typ> void zamien(Typ *ptrA, Typ *ptrB)
{
	Typ tmp = *ptrA;
	*ptrA = *ptrB;
	*ptrB = tmp;
} 

// ------------------------------------
int main(void)
{
	double a = 5.4;
	double b = 10.1;
	
	zamien<double>(&a, &b);
	
	char c = 'a';
	char d = 'x';
	
	zamien<char>(&c, &d);
	
	printf("%f, %f\n", a, b);
	printf("%c, %c\n", c,d);


}