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

Dudas sobre punteros

Estas en el tema de Dudas sobre punteros en el foro de C/C++ en Foros del Web. Por que es permitido inicialzar un puntero de tipo char asi: char *nom="Jose"; si se supone que yo solo puedo inicilizar un apuntador de 4 ...
  #1 (permalink)  
Antiguo 01/04/2010, 02:08
Avatar de jose_desa  
Fecha de Ingreso: marzo-2010
Mensajes: 19
Antigüedad: 14 años, 8 meses
Puntos: 0
Pregunta Dudas sobre punteros

Por que es permitido inicialzar un puntero de tipo char asi:

char *nom="Jose";

si se supone que yo solo puedo inicilizar un apuntador de 4 maneras (que yo conosco)

1. Con el apuntador Nulo char *nom=NULL;
2. Con la direccion de otra variable char *nom=&n;
3. Con el operador New char *nom=new char;
4. Con otro apuntador char *nom=apell;

bueno esa seria una de mis dudas, la otra duda que tengo que se relaciona es:

Por que cuando yo hago lo siguiente:

Código C++:
Ver original
  1. char text="Good morning!"; // o asi char text[14]={'G','o','o','d',' ','m','o','r','n','i','n','g','!','\0'},
  2.  
  3. char *cPtr=&text[0];  // o asi   char *cPtr=text;
  4. cout<<cPtr; //aqui me muestra  Good morning!
  5. cout<<*cPtr; //aqui muestra la G
  6. cout<<*(cPtr+3); //muestra la letra d
  7. cout<<cPtr+3; //muestra d morning!

Mi duda es en la linea 4 y 7 por que el nombre del puntero me regresa el contenido del arreglo si se supone que el puntero contiene la direccion, por ejemplo si hago lo siguiente:

Código C++:
Ver original
  1. int x[4]={56,87,6,32};
  2. int *y=x;
  3. cout<<y;   // aqui me regresa la una direccion no el contenido como en el char

Otra duda, cuando yo quiero mostrar la direccion a la que apunta un puntero solo tengo que poner el nombre de mi puntero en un cout como:
Código C++:
Ver original
  1. int x=5;
  2. int *y=&x;
  3. cout<<y;  // aqui me mostraria la direccion como 0x003751E4
  4. cout<<*y; //haria esto, si quisiera mostra el contenido de la direccion a la que apunta 5
pero si hago esto con un puntero a char pasa lo siguiente:

Código C++:
Ver original
  1. char n="como te llamas";
  2. char *text=n;
  3.  
  4. cout<<text; // aqui me muestra directamente el contenido de la direccion a la que apunta "como te llamas"
  5.  
  6. cout<<*text; //aqui me muestra la letra c;

mi pregunta es, como puedo saber la direccion que a la que apunta text.

Bueno estas son mis dudas espero haberme dado a entender, y se los agradezco de antemano a aquellos que me contesten, gracias.

Última edición por jose_desa; 01/04/2010 a las 14:30 Razón: mejor presentacion
  #2 (permalink)  
Antiguo 01/04/2010, 04:44
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Dudas sobre punteros

Cita:
Iniciado por jose_desa Ver Mensaje
Por que es permitido inicialzar un puntero de tipo char asi:

char *nom[]="Jose";
Esto es un error de compilacion.

Sin embargo, no es un error hacerlo asi:

char* nombre = "Jose";

o asi

char nombre[] = "Jose";

debido a que se ha definido que este tipo de inicializacion es igual a haberlo hecho asi:

char* nombre = { 'J', 'o', 's', 'e', '\0' }; // ojo con el fin de string al final

Es una bendicion que se le dio al compilador para que el programador no tenga que escribir mas de la cuenta.

En el ejemplo dado, hay un error, pues la definicion puesta en el comentario no es equivalente. Le falta el '\0' final, que el string literal provee.

Cita:
Iniciado por jose_desa Ver Mensaje
char text[]="Good morning!"; // o asi char text[14]={'G','o','o','d',' ','m','o','r','n','i','n','g','!'},
cout esta entrenado para escribir un char* de manera distinta que un char.
En el caso de un char* se pone a escribir chars hasta encontrar un '\0', desde la direccion de memoria que recibe.
  #3 (permalink)  
Antiguo 01/04/2010, 14:03
Avatar de jose_desa  
Fecha de Ingreso: marzo-2010
Mensajes: 19
Antigüedad: 14 años, 8 meses
Puntos: 0
Pregunta Respuesta: Dudas sobre punteros

gracias por tu respuesta calgarycorpus

Última edición por jose_desa; 01/04/2010 a las 14:32 Razón: equivocacion
  #4 (permalink)  
Antiguo 01/04/2010, 15:35
Avatar de jose_desa  
Fecha de Ingreso: marzo-2010
Mensajes: 19
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Dudas sobre punteros

Como hago lo siguiente:
cuando yo quiero mostrar la direccion a la que apunta un puntero solo tengo que poner el nombre de mi puntero en un cout como:
Código C++:
Ver original
  1. int x=5;
  2. int *y=&x;
  3. cout<<y;  // aqui me mostraria la direccion como 0x003751E4
  4. cout<<*y; //haria esto, si quisiera mostra el contenido de la direccion a la que apunta 5
pero si hago esto con un puntero a char pasa lo siguiente:

Código C++:
Ver original
  1. char n="como te llamas";
  2. char *text=n;
  3.  
  4. cout<<text; // aqui me muestra directamente el contenido de la direccion a la que apunta "como te llamas"
  5.  
  6. cout<<*text; //aqui me muestra la letra c;

mi pregunta es, como puedo saber la direccion que a la que apunta text.
  #5 (permalink)  
Antiguo 01/04/2010, 15:46
Avatar de jose_desa  
Fecha de Ingreso: marzo-2010
Mensajes: 19
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Dudas sobre punteros

Otra duda por que cuando declaro un puntero de tipo string y hago lo siguente:

Código C++:
Ver original
  1. string nom="hola";
  2. string *n=&nom;
  3. cout<<n;  //0x0012ff64
  4. cout<<*n;   //aqui me marca error si se supone que me debe regresar lo que hay en la direccion ("hola")

El error es:
C:\Documents and Settings\Administrador\pruebas.cpp(34) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' (or there is

Por favor ayudenme
  #6 (permalink)  
Antiguo 01/04/2010, 20:12
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Dudas sobre punteros

Cita:
Iniciado por jose_desa Ver Mensaje
mi pregunta es, como puedo saber la direccion que a la que apunta text.
Cuando usas cout y el operador << usas las distintas implementaciones de la sobrecarga (o multidefinicion) de ese operador.

Cuando pones a la derecha de << un puntero a char (char*), el operador << esta implementado para recorrer la memoria hasta llegar al "\0'. Cuando se encuentra con un puntero a otro tipo de dato, imprime la dirección de memoria.

Una manera de imprimir la direccion de memoria de un char* es hacer un cast, asi:

Código C++:
Ver original
  1. char *text = ...
  2.  
  3. cout <<  "direccion: " <<  static_cast<void *>(text) ;
  #7 (permalink)  
Antiguo 02/04/2010, 01:32
Avatar de jose_desa  
Fecha de Ingreso: marzo-2010
Mensajes: 19
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Dudas sobre punteros

Cita:
Iniciado por jose_desa Ver Mensaje
Otra duda por que cuando declaro un puntero de tipo string y hago lo siguente:

Código C++:
Ver original
  1. string nom="hola";
  2. string *n=&nom;
  3. cout<<n;  //0x0012ff64
  4. cout<<*n;   //aqui me marca error si se supone que me debe regresar lo que hay en la direccion ("hola")

El error es:
C:\Documents and Settings\Administrador\pruebas.cpp(34) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' (or there is

Por favor ayudenme
¿Como puedo mostrar el valor de la variable a la que apunta un puntero de tipo string(en este caso el valor de nom ("hola ")) ?
gracias, una vez mas CalgaryCorpus te pido a ti o alguien mas de este foro que por favor si no es mucha molestia, me ayuden con esta otra duda que tengo. Gracias
  #8 (permalink)  
Antiguo 02/04/2010, 03:56
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Dudas sobre punteros

No parece haber error en lo que escribes, pero si parece haber mucha censura. El error lo marca en la linea 34, y solo has mostrado 4 lineas. Tal vez la respuesta está en las lineas que no mostraste. Podrias mostrar el programa completo que marca el error de compilacion?
  #9 (permalink)  
Antiguo 02/04/2010, 11:39
Avatar de jose_desa  
Fecha de Ingreso: marzo-2010
Mensajes: 19
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Dudas sobre punteros

Aqui esta mi codigo completo:

Código C++:
Ver original
  1. #include<iostream.h>
  2. #include<string>
  3. using namespace std;
  4.  
  5.  
  6. void main()
  7. {
  8.     /*  char blocks[4]={'A','B','C'};
  9.     int arr[4]={11,2,3,4};
  10.     int *iPtr=arr;
  11.     char *ptr=blocks;
  12.     cout<<" prt "<<ptr;
  13.     cout<<" blocks  "<<blocks;
  14.     char temp='0';
  15.     temp=blocks[0];
  16.     temp=*(blocks+2);
  17.     temp=*(ptr+1);
  18.     temp=*ptr;
  19.     ptr=blocks+1;
  20.     temp=*ptr;
  21.     cout<<ptr;
  22.     temp=*(ptr+1);
  23.     ptr=blocks;
  24.     temp=*++ptr;
  25.     temp=++*ptr;
  26.     temp=*ptr++;
  27.     temp=*ptr;*/
  28. //  char *text ="hola";
  29. //  cout <<  "direccion: " <<  static_cast<void *>(text)<<endl ;
  30.     string nom="hola";
  31.     string *n=&nom;
  32.     cout<<n;  //0x0012ff64
  33.     cout<<endl;
  34.     cout<<*n;   //aqui me marca error si se supone que me debe regresar lo que hay en la direccion ("hola")
  35.  
  36. }

c:\documents and settings\administrador\pruebas.cpp(34) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' (or there is no acceptable conversion)
Error executing cl.exe.

pruebas.exe - 1 error(s), 0 warning(s)


Quite todos los comentarios para dejar solo el codigo que estoy utilizando y me marca el error tambien:

Código C++:
Ver original
  1. #include<iostream.h>
  2. #include<string>
  3. using namespace std;
  4.  
  5. void main()
  6. {
  7.     string nom="hola";
  8.     string *n=&nom;
  9.     cout<<n;  
  10.     cout<<endl;
  11.     cout<<*n;  
  12. }

C:\Documents and Settings\Administrador\pruebas.cpp(11) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' (or there is no acceptable conversion)
Error executing cl.exe.

pruebas.exe - 1 error(s), 0 warning(s)

ya intente en otro nuevo archivo cpp, y tambien ya lo trate de correr en otra computadora y me marca el mismo error.

Última edición por jose_desa; 02/04/2010 a las 11:59 Razón: Complementar
  #10 (permalink)  
Antiguo 02/04/2010, 12:02
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Dudas sobre punteros

Recomendaciones:

- main deberia ser definido para que retorne int, y al final hacer un return 0; o return <cualquier entero>; .

- Usa <iostream> y no <iostream.h>

- Prueba usando otro compilador tambien. Por ejemplo, modifique el programa, con las indicaciones previas, lo copie en codepad.org, lo ejecute y puedes mirar el resultado, mientras no sea borrado, en este link: http://codepad.org/0Ygl8B3A

- Si lo borraron, aqui va, modificado:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.     string nom="hola";
  8.     string *n=&nom;
  9.     cout << n;  //0x0012ff64
  10.     cout << endl;
  11.     cout << "n = " << *n << endl;
  12.  
  13.     return 0;
  14. }

Etiquetas: apuntadores, c++, pointers, 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 11:13.