[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