Foros del Web » Programación para mayores de 30 ;) » C/C++ »

duda

Estas en el tema de duda en el foro de C/C++ en Foros del Web. hola tengo una duda.. si hago esto: codigo C++: Código: const char *puntero=0; puntero="hola"; que ocurre internamente? el compilador crea el puntero y luego, en ...
  #1 (permalink)  
Antiguo 22/02/2011, 13:44
 
Fecha de Ingreso: junio-2010
Mensajes: 46
Antigüedad: 13 años, 10 meses
Puntos: 0
Pregunta duda

hola tengo una duda.. si hago esto:

codigo C++:
Código:
const char *puntero=0;
puntero="hola";
que ocurre internamente? el compilador crea el puntero y luego, en la asignacion, crea una cadena de caracteres, la guarda en memoria y el puntero va a apuntar a la direccion del primer caracter (h)? y luego si hago:
Código:
char a='a';
pt=&a;
que ocurre con la cadena que se guardo en memoria "hola"?.. deja de exitir o sigue existiendo hasta que el programa termine solo que el puntero no a apuntar a ella.. y si este es el caso como puedo volver a apuntar a la cadena?

gracias
  #2 (permalink)  
Antiguo 22/02/2011, 21:28
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 2 meses
Puntos: 22
Respuesta: duda

Cita:
Iniciado por cabeto14 Ver Mensaje
hola tengo una duda.. si hago esto:

codigo C++:
Código:
const char *puntero=0;
puntero="hola";
que ocurre internamente? el compilador crea el puntero y luego, en la asignacion, crea una cadena de caracteres, la guarda en memoria y el puntero va a apuntar a la direccion del primer caracter (h)? y luego si hago:
Código:
char a='a';
pt=&a;
que ocurre con la cadena que se guardo en memoria "hola"?.. deja de exitir o sigue existiendo hasta que el programa termine solo que el puntero no a apuntar a ella.. y si este es el caso como puedo volver a apuntar a la cadena?

gracias
Efectivamente, el array de caracteres "hola" se crea en la zona de almacenamiento estático del programa, por lo tanto existe hasta que el programa termina.

En este caso si asignas otra dirección al puntero no podrás volver a apuntarla.
  #3 (permalink)  
Antiguo 23/02/2011, 10:35
 
Fecha de Ingreso: junio-2010
Mensajes: 46
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: duda

ok fightmx gracias por tu respuesta.. leyendo por ahi encontre un enunciado:

Cita:
el valor de una cadena es la direccion del primer carácter; en este sentido, las cadenas son como los arreglos, debido a que el nombre de un arreglo es tambien un apuntador a su primer elemento.
osea que las constantes de cadena son en realidad un arreglo aparte de caracteres? y que estas se utilizan solo como inicializador de un arreglo o de un puntero const char * ? osea que cuando yo hago:
Código:
cout<<"hola";
estoy creando una cadena constante de caracteres en memoria y que esta cadena ("hola") dura hasta que el programa termine pues su clase de almacenamiento es static??, entonces si vuelvo a hacer un cout<<"hola"; mas abajo, voy a acceder a la misma direccion de memoria pues "hola" ya esta almacena
y su valor permanece hasta el fin del programa..

gracias

Última edición por cabeto14; 23/02/2011 a las 10:55
  #4 (permalink)  
Antiguo 23/02/2011, 13:55
 
Fecha de Ingreso: junio-2005
Mensajes: 93
Antigüedad: 18 años, 10 meses
Puntos: 9
Respuesta: duda

Las cadenas como a las que tu te refieres son guardadas en un lugar de la pila asignado para constantes
  #5 (permalink)  
Antiguo 23/02/2011, 14:10
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: duda

Cita:
Iniciado por cabeto14 Ver Mensaje
ok fightmx gracias por tu respuesta.. leyendo por ahi encontre un enunciado:



osea que las constantes de cadena son en realidad un arreglo aparte de caracteres? y que estas se utilizan solo como inicializador de un arreglo o de un puntero const char * ? osea que cuando yo hago:
Código:
cout<<"hola";
estoy creando una cadena constante de caracteres en memoria y que esta cadena ("hola") dura hasta que el programa termine pues su clase de almacenamiento es static??, entonces si vuelvo a hacer un cout<<"hola"; mas abajo, voy a acceder a la misma direccion de memoria pues "hola" ya esta almacena
y su valor permanece hasta el fin del programa..

gracias
Esto que tu dices depende de las optimizaciones del compilador. Pero puedo asegurar que los compiladores mas usados son tan inteligentes de solo almacenar la cadena "hola" una vez. y no repetirla cada vez que el usuario la quiera usar.
  #6 (permalink)  
Antiguo 23/02/2011, 14:50
 
Fecha de Ingreso: junio-2010
Mensajes: 46
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: duda

ok muchas gracias por sus respuestas.. solo confirmenme algo mas: las cadenas constante de caracteres o literales cadena son en realidad arreglos de caracteres aparte que ademas contiene el caracter nulo de terminacion de cadena '\0'.

curioseando con el compilador hice:

Código:
cout<<("hola")[2];
y me imprimio el caracter l.. estoy confirma lo que dije ahorita no?

gracias
  #7 (permalink)  
Antiguo 23/02/2011, 22:20
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 2 meses
Puntos: 22
Respuesta: duda

Es correcto.

Código C++:
Ver original
  1. cout << "012345"[2] << endl; // 2
  2. cout << &"012345"[2] << endl; // 2345

Puedes complementar con la siguiente liga.
  #8 (permalink)  
Antiguo 24/02/2011, 08:56
 
Fecha de Ingreso: junio-2010
Mensajes: 46
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: duda

ok muchas gracias

Etiquetas: c++, cadenas, caracteres, punteros
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:57.