SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: cabeto14 en Sábado 26 de Diciembre de 2009, 19:02

Título: operador de incremento y punteros
Publicado por: cabeto14 en Sábado 26 de Diciembre de 2009, 19:02
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++
  1.  
  2. *puntero++; /* Equivale a vector[0]++; */
  3. puntero++; /* puntero equivale a &vector[1] */
  4.  
  5.  
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

pero al llevarlos a la practica, la segunda linea hace lo que me explican, pero la primera no:
Código: C++
  1.  
  2. int main ()
  3. {
  4. int a[4]={2,4,8,9},*p;
  5. p=a;
  6. cout<<*p<<"t";
  7. *p++;
  8. cout<<*p;
  9.  
  10. return 0;
  11. }
  12.  
  13.  
  14.  
 
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++
  1.  
  2. int main ()
  3. {
  4. int a[4]={2,4,8,9},*p;
  5. p=a;
  6. cout<<*p<<"t";
  7. ++*p;
  8. cout<<*p;
  9.  
  10. return 0;
  11. }
  12.  
  13.  

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.
Título: Re: operador de incremento y punteros
Publicado por: Eternal Idol en Sábado 26 de Diciembre de 2009, 19:36
La segunda operacion (el incremento) se esta haciendo primero, si usas parentesis podes asegurarte que primero se desreferencie:
Código: C++
  1. (*p)++;
  2.  
Título: Re: operador de incremento y punteros
Publicado por: cabeto14 en Sábado 26 de Diciembre de 2009, 20:35
ok. lo que me dices es equivalente a hacer ++*p. pero, ¿sabes porque hay que encerrarlo en parentesis o ponerle el incremento como prefijo?
Título: Re: operador de incremento y punteros
Publicado por: ProfesorX en Sábado 26 de Diciembre de 2009, 21:36
Cita de: "cabeto14"
¿sabes porque hay que encerrarlo en parentesis o ponerle el incremento como prefijo?

Esto se debe a la precedencia de operadores (http://es.wikipedia.org/wiki/Operadores_de_C_y_C%2B%2B) 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 :)
Título: Re: operador de incremento y punteros
Publicado por: cabeto14 en Domingo 27 de Diciembre de 2009, 02:10
ok. cero dudas muchas gracias.
Título: Re: operador de incremento y punteros
Publicado por: su - en Domingo 27 de Diciembre de 2009, 02:36
Quiero complementar algo  ^_^
Cita de: "cabeto14"
...o ponerle el incremento como prefijo?
Cual es la diferencia entre post-incremento (i++) y pre-incremento (++i)?
Aqui tenes la respuesta completa. (http://ftp.tuwien.ac.at/languages/c/programming-bbrown/c_015.htm)
Título: Re: operador de incremento y punteros
Publicado por: cabeto14 en Domingo 27 de Diciembre de 2009, 02:44
muchas gracias su- por complementar.