[C con Clase] Capitulo 12
Joaquin Fernandez
joaquinfq en gmail.com
Mie Ene 31 18:45:22 CET 2007
> "La segunda incrementa el puntero, esto significa que apuntará a la
> posición de memoria del siguiente "int", pero no a la siguiente posición
> de memoria. El puntero no se incrementará en una unidad, como tal vez
> sería lógico esperar, sino en la longitud de un "int"."
>
> Aquí es donde me confundo, al ejecutar la aplicación, me dí cuenta de
> que "puntero" si cambia a la siguiente posicición de memoria aunque en
> el texto anterior dice que no, esto me lo pueden explicar, porque yo no
> lo veo, verán el resultado que a mi me da al incrementar puntero es el
> siguiente:
>
> El valor es: 9
> Memoria es: 0x0012FF58
> El valor es: 8
> Memoria es: 0x0012FF5C
> El valor es: 7
> Memoria es: 0x0012FF60
> El valor es: 6
> Memoria es: 0x0012FF64
> El valor es: 5
Leyendo con detenimiento no encuentro el error o lo que no entiendes. Se dice que el puntero
"apuntará a la posición de memoria del siguiente int" y eso es exactamente lo que está haciendo. Un
int ocupa 4 bytes, el primero está en 0x0012FF58 y el siguiente en 0x0012FF5C, es decir, aumentó en
4 bytes el valor del puntero.
También dice "pero no a la siguiente posición de memoria" y eso también se cumple. Primero está en
0x0012FF58 y luego en 0x0012FF5C, y no en 0x0012FF59 que es la siguiente posición de memoria a
0x0012FF58.
Míralo así:
puntero++ ----> puntero = puntero + sizeof(int)
> El otro problema que me surge es que si quiero hacer referencia al
> primer elemento del vector desde el puntero una vez incrementado x
> veces, no puedo colocar la siguiente línea "puntero[0]", sino que tengo
> que colocar el valor en negativo segun las x veces que haya ejecutado
> "puntero++", ejemplo:
> Si he incrementado "puntero" 3 veces entonces para visualizar el primer
> valor del puntero tengo que escribir lo siguiente:
> cout << puntero[-3] << endl;
Esto no es recomendable escribirlo así. Usando la aritmética de punteros de manera apropiada y
clara, deberías escribir:
cout << puntero - 3 << endl;
El compilador no le restará 3 al puntero sino "3 posiciones" de acuerdo al tipo de datos al que
apunte el puntero. En este caso le restará 3 * sizeof(int) = 12. Los corchetes déjalos para los
vectores no para los punteros, salvos casos muy específicos.
Saludos
Joaquín
Más información sobre la lista de distribución Cconclase