Ok, esto cambia las cosas... pero no tanto:D
Piensa que la esctructura
struct personas {
char nombre[30];
char apellido[30];
};
no es mas que eso, una estrucutra compuesta, en este caso, de dos variables, por lo tanto, se puede decir que la estructura es una especie de array (conjunto de variables:)) Por lo tanto, los punteros en este caso tienen la misma ventaja que si fuese un array (o cualquier otra variable), el alojamiento en memoria DINAMICO. Pero tambien tiene un problema, que debes reservarle memoria. Supongo que ya sabras manejar el malloc, pero por si acaso, aqui te pongo un ejemplo.
p_amigos = (struct personas *)malloc( sizeof(struct personas));
Con esto reservas memoria y el puntero p_amigos apunta a esa memoria reservada. Por supuesto, cuando no uses mas esa memoria, debes reservarla con free, en este caso, su uso sería
free(p_amigos);
Todo esto se puede resumir en lo mismo que te dije en el primer mensaje que postee, que el puntero tiene la ventaja de que puedes gestionar la memoria DINAMICAMENTE, no hay mas:)
Saludos,
Tenesor