Ver Mensaje Individual
  #3 (permalink)  
Antiguo 11/09/2008, 13:19
Avatar de Mort20
Mort20
 
Fecha de Ingreso: junio-2008
Ubicación: Roca Casterly
Mensajes: 141
Antigüedad: 15 años, 11 meses
Puntos: 2
Respuesta: Pregunta facil

Tu error es de concepto, que como dices que acabas de llegar a punteros es normal. Para que lo entiendas te explico un poco resumido el concepto de la forma con la que yo lo entendí en su momento.

Supongamos que en nuestra memoria tenemos 2 espacios (pongo sólo 2 para simplificar) para almacenar cosas del mismo tamaño (2 bytes, por ejemplo).
Vale, hacemos el puntero que tu haces. Fecha1 se almacena en el primer espacio, y su contenido esta indefinido porque aún no le hemos asignado nada. El esquema sería así:
Código:
+------+
|Fecha1| //Espacio reservado, pero fecha 1 aún no contiene información
| null | //nada almacenado
+------+
Luego hacemos string p (en C++ esto es como un char[], tiene el mismo efecto). Tenemos:
Código:
+------+
|Fecha1| //sin información
|   p  | //reservado, pero sin información
+------+
Finalmente hacemos fecha1 = p; (o fecha1 = &p; es equivalente). Entonces el espacio de fecha1 pasa a contener la dirección de p. Es decir, dónde está ubicado p en la memoria, pero no su valor. Si hacemos *fecha1 estaríamos cargando el valor contenido en fecha1, es decir, el valor contenido en la dirección dónde tenemos p, dónde obviamente, tneemos el valor de p, actualmente nulo.
Si hicieramos p="30"; *fecha1 contendría la cadena de carácteres "30". Y si hacemos *fecha1="30", sería lo mismo que guardar en la dirección de memoria perteneciente a p la cadena "30".
En resumen, p="30" y *fecha1="30" es lo mismo.
Sin embargo, si hubieramos hecho *fecha1="30" antes de asignarle una dirección de memoria a fecha1, eso daría un error puesto que no sabe dónde debe guardarlo, no hay ninguna dirección almacenada en fecha1.

Espero que con esto hayas entendido tu error, en resumen en C++, y usando memoria dinámica (que es el uso principal de los punteros, sería):
Código:
int main (void){
char *fecha1 = new char(10); //alternativa: char *fecha1 = new string();
cout << "introduzca la primera fecha en formato dd/mm/aa " << endl;
cin.getline(fecha1, 10);
delete fecha1;
}
Sin memoria dinámica:
Código:
int main (void){
char *fecha1;
char espacio[10]; //alternativa: string espacio;
fecha1 = espacio; //fehca1 apunta a espacio, vector de 10 carácteres
cout << "introduzca la primera fecha en formato dd/mm/aa " << endl;
cin.getline(fecha1, 10);
}
Como ves, sin memoria dinámica la aplicación es algo absurda pues para eso no necesitamos usar un puntero. Con la memoria dinámica, estamos generando el espacio para la variable, pero cuando acabemos de usarla la vamos a destruir (delete).
__________________
Un Lannister siempre cumple sus promesas