Te amplio un poco lo que te cuenta Ismael.
Puedes imaginar un puntero como una flecha que apunta a algo.
Si tienes
char *c
c es una flecha (un puntero) que apunta a un caracter
*c es la cosa a la que apunta la flecha, es decir, el caracter.
&c es una flecha (un puntero) que apunta a c. c a su vez es otra flecha que apunta a un caracter. O sea, tienes una flecha que apunta a otra flecha que a su vez apunta a un caracter
A la hora de declarar variables, tanto el * como el & tienen un significado un poco distinto. El & para declarar variables solo es válido en C++. Cuando digo declarar variables me refiero tanto a declaración de variables como a parámetros de funciones.
void funcion (char *c)
Quiere decir que esta función admite como parámetro un puntero a char (una flecha a un caracter). Vale en C y C++. c es un puntero a char
void funcion (char &c)
Solo vale en C++. Quiere decir que admite una variable char. A esta funcion no podrías pasarle, por ejemplo
funcion ('a');
Tendrias que hacer
char b = 'a';
funcion (b);
Ademas, haciéndolo de esta forma, b y c son exactamente la misma variable, solo que con distinto nombre. Si cambias una, la otra también cambia. Declarado de esta forma, c es una variable de char como otra cualquiera.
Se bueno.