Ver Mensaje Individual
  #11 (permalink)  
Antiguo 21/03/2012, 18:17
sam90
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 9 meses
Puntos: 228
Respuesta: Cadenas en C/C++

Los punteros son una variable de 32 bits (o 64) que almacenan una direccion de memoria. En esa direccion estan los datos que nos interesa.
Cuando definimos
Char * p = "Hola mundo";

El compilador lo que hace es alamacenar "Hola mundo" en la parte statica de la memoria y declara un puntero p que tiene la direccion de memoria de esa parte statica (Al primer caracter de la cadena, osea, "H").

Ahora lo que tienes que entender que tambien se puede aplicar aritmetica de direcciones de memoria. Es por eso que si yo a p le sumo uno obtengo el siguiente caracter. Una forma abreviada de hacer eso es usar los corchetes, de la sigueinte manera:

p[1] == 'o' y p[2] == 'l'

p[1] es lo mismo que hacer *(p+1) pero creo que con esto te la estoy complicando mucho....

Ahora otra cosa para que tengas en cuenta.

Cuando declaramos un array de esta forma:
char a[10];
El compilador hace algo muy distinto a lo que hace con la variable p, aunque la variable a sigue siendo un puntero. De esta nueva forma el compilador reserva el espacio en memoria (si es dentro de una funcion en la memoria local) pero esta vez el puntero a no existe en memoria. Solo existe para el compilador. A la hora de enlazar traduce cada aparicion de a por su direccion...

No se si se alla entendido pero te muetro un ejemplo con lo que se puede hacer y que no se puede hacer con las dos declaraciones:

Código C:
Ver original
  1. char * p = "Hola mundo";
  2. char * t;
  3. char a[10];
  4.  
  5. p = "Chau mundo"; // Si se puede
  6. p = t; // si se puede
  7. a = "No se puede hacer"; // No se puede, porque no se puede cambiar el valor de a pero si los datos a donde apuntan.
  8. a[1] = 'o';a[2]='l'; // Si se puede hacer

Trate de ser lo mas entendible posible.. cualquier cosa segui preguntando...estoy seguro que estoy generando nuevas dudas porque me parece que me puse un poco tecnico... pero me parece un tema mas que importante si se quiere aprender de verdad C/C++.

Saludos