Pues mira, respecto a tu primera pregunta hay 2 soluciones a tu problema, si deseas unir una variable de tipo int con una tipo string (o char* como le dices, que aunque realmente no es lo mismo, supongamos que lo es), utilizar la funcion
void itoa(int input, char *buffer, int radix)
donde input es el numero que quieres convertir a char, buffer es la variable en donde guardaras el numero convertido, y radix, la base a la que quieres convertir, en este caso supongo que trabajas en base 10, asi que si quisieras convertir el numero 23, pondrias:
char numero[5];
itoa(23, numero, 10);
y luego usarias strcat para hacer la concatenacion de cadenas.
El detalle es que itoa no esta el estandar ansi c, asi que no es portable.
La mejor solucion seria usar la funcion sprintf, (o snprintf) que funciona identico a printf, con la diferencia que la salida se guarda en un string, en lugar de ir hacia la pantalla
tomando tu ejemplo, seria:
char MayusculaNumero[10];
sprintf(MayusculaNumero, "%c%d", ch, a);
Respecto a tu segunda duda, asi es, el codigo ASCII de los numeros es consecutivo, lo que significa que '5' > '3' tal como dices.
Saludos