Programación General > C/C++

 operador de incremento y punteros

(1/2) > >>

cabeto14:
hola. soy nuevo en el foro mi nombre es carlos alberto hinojosa soy de colombia y tengo 16 años. estoy estudiando c++ y voy por punteros, en el curso que sigo me aparece esto:

--- Código: C++ --- *puntero++; /* Equivale a vector[0]++; */puntero++; /* puntero equivale a &vector[1] */  y me explican que en la primera linea incrementa el contenido de la memoria apuntada por "puntero", que es
vector[0], es decir que si en la posicion [0] habia un 2 ahora aumenta a 3, eso es lo que entendí. y en la segunda linea me explican que cambia la posicion a la que apunta el puntero es decir que si antes apuntaba a [0] ahora lo hace a [1].

pero al llevarlos a la practica, la segunda linea hace lo que me explican, pero la primera no:

--- Código: C++ --- int main (){int a[4]={2,4,8,9},*p;p=a;cout<<*p<<"t";*p++;cout<<*p; return 0;}    
el resultado que esperaria es que me mostrara en pantalla esto
 
2                      3
 
pero en cambio me muestra
 
2                      4
 
parece como si en vez de aumentar la variable lo que hace es exactamente lo que indica la linea dos (mas arriba).
para obtener el resultado deseado tengo que poner el incremento como prefijo asi:

--- Código: C++ --- int main (){int a[4]={2,4,8,9},*p;p=a;cout<<*p<<"t";++*p;cout<<*p; return 0;}  
entonces me gustaria saber porque pasa esto. si se supone que cuanto esta el operador de "desreferencia" o "indireccion" (*) se esta trabajando con el valor almacenado el la posición de memoria que almacena el puntero.

Eternal Idol:
La segunda operacion (el incremento) se esta haciendo primero, si usas parentesis podes asegurarte que primero se desreferencie:

--- Código: C++ ---(*p)++; 

cabeto14:
ok. lo que me dices es equivalente a hacer ++*p. pero, ¿sabes porque hay que encerrarlo en parentesis o ponerle el incremento como prefijo?

ProfesorX:

--- Cita de: "cabeto14" ---¿sabes porque hay que encerrarlo en parentesis o ponerle el incremento como prefijo?
--- Fin de la cita ---

Esto se debe a la precedencia de operadores en C/C++, ya que el operador ++ (incremento) tiene mayor precedencia que el operador * (indireccion), ademas de que el orden de evaluacion de ++ es de derecha a izquierda, en lugar de izquierda a derecha como el operador *, por lo tanto, incrementa la direccion de la variable primero, y luego accede al dato. Por eso para garantizar que se acceda primero al dato, y luego se incremente, se usa parentesis, todo lo que este entre parentesis tiene mayor precedencia que lo que no tiene parentesis, garantizando que los operadores se evaluen de la manera como tu quieras y no de la manera por defecto.

Saludos :)

cabeto14:
ok. cero dudas muchas gracias.

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa