En esta función:
Prueba* pPrueba()
{
Prueba ejemplo1;
return &ejemplo1;
}
Estas retornando la dirección de una variable local, no es valido ya que todas las variables locales se destruyen al finalizar la función.
Para que compile sin problemas puedes calificar la variable "ejemplo1" con static, de esa forma la variable existe durante toda la duración del programa:
Prueba* pPrueba()
{
static Prueba ejemplo1;
return &ejemplo1;
}
Con todo el ejemplo solo tiene caso (sentido) para practicar el uso de funciones y sus valores de retorno.
Un saludo