Un apellido es una cadena de caracteres, es decir
char *apellido;
para hacer un array de eso, debes poner otro asterisco mas
char **apellido.
De esta forma apellido[0] es el primer apellido, apellido[1] el segundo, etc. apellido [0][3] es la cuarta letra del primer apellido.
Debes reservar espacio para el array de apellidos
apellido = new char *[10 ] // 10 apellidos. No estoy seguro si es asi la sintaxis
y luego reservar espacio para cada apellido
for (i=0; i<10; i++)
apellido[i] = new char[20]; // 20 letras por apellido
Para liberar, igual pero al revés.
Si quieres "simplificar" un poco esto, puedes hacer
typedef apellido char[20]; // el tipo apellido en un string de 20 caracteres
apellido tabla_apellidos[10]; // array de 10 apellidos.
Te evitas de esta forma reservar memoria, aunque los tamaños quedan fijados.
Incluso puees dejar el typedef apellido y reservar el espacio de la tabla
apellido *tabla_apellidos;
tabla_apellidos = new apellido[10];
Se bueno