TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: micro_pepe en 24 de Febrero de 2017, 14:28:07

Título: Incrementar contenido de un puntero
Publicado por: micro_pepe en 24 de Febrero de 2017, 14:28:07
Esto es válido en XC8:

Código: C
  1. *(puntero) ++;

porque no hace nada, no incrementa el valor, sin embargo esto si:

Código: C
  1. *(puntero) = *(puntero) + 1;

Gracias, un saludo!!!
Título: Re:Incrementar contenido de un puntero
Publicado por: KILLERJC en 24 de Febrero de 2017, 15:57:06
es por el orden de precedencia.

el ++ tiene mas orden de precedencia que el * (deferenciar o puntero), por lo tanto se "ejecuta" primero

Supongamos que tenes:

ptr=1000;
y
*ptr = 222;

Hacer:

Código: C
  1. *ptr++
  2. //o
  3. *(ptr)++

Como ambos estan fueras del parentesis primer se ejecuta el ++, por lo tanto ptr se incrementa en 1 unidad (si ocupa 4 bytes el tipo, incrementa en 4), es decir queda en 1001 si a lo que apunta es un byte, luego se accede al contenido de esa memoria. Lo cual no se hace nada con eso. Y es lo mismo que nada. El unico efecto que tuvo fue lo mismo que hacer ptr++;

Distinto esto:

Código: C
  1. (*ptr)++;

Ahora si el operador * se encuentra DENTRO del parentesis, los parentesis y el operador ++ tiene la MISMA precendecia, entonces al tener lo mismo comienza a regir la asociatividad que es de izquierda a derecha en ese caso, por lo tanto primero se ejecuta el parentesis y lo adentro, es decir se accede al contenido de ptr, en este caso es 222 y luego se incrementa en 1, ahora si quedando en 223.

Precendecia y Asociatividad:
(Las tablas se encuentras un poco mas abajo del inicio de la pagina)

https://es.wikipedia.org/wiki/Anexo:Operadores_de_C_y_C%2B%2B

La precendecia esta en orden descendente y cada fila o ciertos operadores tienen una asociatividad especifica.
Título: Re:Incrementar contenido de un puntero
Publicado por: micro_pepe en 24 de Febrero de 2017, 21:18:33
OK, gracias!!!

No habia caido en que podia ser un problema de precedencia de operadores, pensé que quizas el xc8 no soportaba esa forma de operar.

Saludos!!!