Sí, los arrays funcionan de forma similar a los punteros. Es posible que el programa te funcione pero eso no quiere decir que esté bien, de hecho no lo está, ese programa tiene varios fallos.
El primero:
scanf("%s",&nombres[x][40]);
Ahí realmente deberias poner:
scanf("%s",nombres[x]);
Al igual que
printf("Nombres: %s ",&nombres[x][40]);
Que debería ser:
printf("Nombres: %s ",nombres[x]);
Por último, has declarado
comp como un puntero a char, pero no estas reservando ningún espacio en memoria para almacenarla, sin embargo luego estas tratando de llenarla con
scanf("%s",comp); con lo que
estás escribiendo en zonas de memoria no reservadas. Para evitar esto declara comp como una cadena de caracteres:
char comp[40];EDIT: también puedes declarar comp como un puntero y luego reservar el espacio dinámicamente:
char *comp;
comp= malloc(40*sizeof(char));
//....
free(comp);
Pero en este caso no merece la pena ya que es un programa muy simple, solo quería mostrarte las diferentes posibilidades que hay.