• Domingo 15 de Diciembre de 2024, 00:32

Autor Tema:  punteros c++  (Leído 1833 veces)

cabeto14

  • Nuevo Miembro
  • *
  • Mensajes: 17
  • Nacionalidad: co
    • Ver Perfil
punteros c++
« en: Miércoles 6 de Enero de 2010, 03:48 »
0
hola.estudiando punteros hay algo que no entiendo. viendo un ejemplo entre las diferencias de un puntero y un array me surgieron ciertas dudas. primero el codigo:
Código: C++
  1.  
  2. #include <iostream>
  3. using namespace std;
  4. int main() {
  5. char cadena1[] = "Cadena 1";
  6. char *cadena2 = "Cadena 2";      
  7. cout << cadena1 << endl;
  8. cout << cadena2 << endl;  
  9. cin.get();
  10. return 0;
  11. }
  12.  
  13.  

si un puntero solo almacena una direccion de memoria ¿por que al ejecutarse el el codigo la linea cout<<cadena2 no muestra una direccion de memoria sino que muestra una cadena de caracter? ¿por que si en la anterior linea se coloca un * antes de cadena2, se muestra solo el primer caracter osea C? es posible asignar una cadena de caracteres a un puntero de esa forma fuera de la declaracion (es decir en cualquier parte del codigo)? ¿como?.

bueno esas son las dudas. porfavor si no me hice entender diganme y vuelvo a replantear el problema. me urge mucho saber la respuesta a esto ya que no me gusta dejar ningun "cabo suelto".

muchas gracias y felicitaciones por la pagina. :good:

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: punteros c++
« Respuesta #1 en: Miércoles 6 de Enero de 2010, 06:12 »
0
1. si un puntero solo almacena una direccion de memoria ¿por que al ejecutarse el el codigo la linea cout<<cadena2 no muestra una direccion de memoria sino que muestra una cadena de caracter?

R.- Esto es debido a la forma en como funciona el metodo cout, el metodo cout verifica el tipo de sus parametros, y segun el tipo que sea, llama a la subrutina adecuada para mostrar esa variable en pantalla. si detecta que la variable es de tipo int, llama a la rutina para imprimir int, si detecta que es de tipo float, llama  a la rutina para imprimir float, si detecta que quieres imprimir un char* o un char[], llama a la rutina de impresion de cadenas. Esto funciona asi gracias a algo lamado sobrecarga de funciones en C++. De hecho es posible crear nuevos "tipos de datos", y decirle a cout la manera en como queremos que se impriman esos datos. Busca mas informacion acerca de Sobrecarga de funciones y operadores.

Antes de C++, si era necesario ser especifico en cuanto al tipo de dato a imprimir, si tu utilizas:

Código: C++
  1.  
  2.     // Muestra la direccion de la cadena
  3.     printf("%x", cadena2);
  4.     // Mustra la cadena
  5.     printf("%s", cadena2);
  6.  
  7.  

El primero si te muestra la direccion en memoria de cadena2 en formato hexadecimal (%x), y el segundo te muestra cadena2 como si fuera una cadena (%s). Como dije antes, cout automaticamente verifica el tipo de parametro y llama a la rutina adecuada, cosa que printf no hacia.

2. ¿por que si en la anterior linea se coloca un * antes de cadena2, se muestra solo el primer caracter osea C?
R. Esto es debido al operador *, al hacerlo, cout deja de creer que es un char* y lo toma como char.

3. es posible asignar una cadena de caracteres a un puntero de esa forma fuera de la declaracion (es decir en cualquier parte del codigo)? ¿como?.

Esto ultimo no lo entendi, tendrias que replantearlo de una manera mas clara

Espero haberte aclarado un poco
Saludos y hasta mañana :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

posman

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Re: punteros c++
« Respuesta #2 en: Miércoles 6 de Enero de 2010, 15:31 »
0
Te refieres a que si se podria primero declarar la variable apuntador y despues asignarle un valor? Algo como
Código: Text
  1.  char *cadena1;
  2.  
  3. cadena1 = "Cadena 1";
  4.  

Creo que si se puede. Hace mucho que no programo en C asi que si alguien ve un error en el codigo, pues corrijalo jejeje. Creo que podria ser algo como esto
Código: Text
  1. char *cadena1;
  2.  
  3. cadena1 = malloc(9); //reservar memoria suficiente para la cadena
  4. strcpy(cadena1,"Cadena 1"); 
  5.  

cabeto14

  • Nuevo Miembro
  • *
  • Mensajes: 17
  • Nacionalidad: co
    • Ver Perfil
Re: punteros c++
« Respuesta #3 en: Miércoles 6 de Enero de 2010, 20:06 »
0
muchas gracias a los dos. a profesor x muchísimas gracias por su explicacion, entendi a la perfeccion. en cuanto a mi ultima pregunta, la entendió correctamente posman. gracias a posman por su explicación a travez de ese código.

muchas gracias.