punteros operadores matrices lenguaje estructura direccion declaracion datos apuntadores c pointers lvalue

operadores - ¿Es un puntero desreferenciado un valor l válido?



punteros void lenguaje c (5)

Asumiendo la definición:

int i = 10; int *p = &i;

¿Por qué * pa valid lvalue aquí?

*p+=10;

No debe * p evaluar el valor del int almacenado en & i, es decir. 10, y por lo tanto genera un error "Not an lvalue"?


Creo que estás confundido con la definición de p . p es, de hecho, una variable de tipo puntero a int , y su valor se inicializa a la dirección de i .

No obstante, *p es un lvalue válido, una expresión válida para una ubicación de almacenamiento.


En palabras muy simples, los punteros apuntan a un objeto (en un sentido general, no OOP), no a los contenidos de ese objeto. Entonces, sí, un puntero desreferenciado es un lvalue válido.

En términos de muy bajo nivel. Un puntero no es más que una dirección de memoria, un puntero desreferenciado es la memoria en esa dirección.


No debe *p evaluar el valor del int almacenado en &i , es decir. 10, y por lo tanto genera un error "Not an lvalue"?

En palabras simples,

* significa "valor en la dirección".

*p significa "valor en la dirección dada por el valor de p ".

*p = 10; significa "establecer 10 como el valor en la dirección dada por el valor de p ".

lvalue es una expresión que se refiere a un objeto almacenado en algún lugar de la memoria. *p es también una expresión que se refiere a un objeto almacenado en la ubicación p .


Un lvalue es una expresión que hace referencia a una región de almacenamiento que se puede manipular.

*p es una expresión que se refiere a una región de almacenamiento. Esto es diferente de decir 10+=10; porque 10 no se refiere a una región de almacenamiento como lo haría una variable.


C11 6.5.3.2p4 :

Semántica

...

  1. El operador unario * denota indirección. Si el operando apunta a una función, el resultado es un designador de función; si apunta a un objeto, el resultado es un valor l que designa el objeto . Si el operando tiene el tipo '''' puntero para escribir '''', el resultado tiene el tipo '''' tipo ''''. Si se ha asignado un valor no válido al puntero, el comportamiento del operador unario * no está definido

Es decir, con

int i = 10; int *p = &i;

el resultado de *p es un valor l que designa el objeto i .

Por lo tanto, *p += 10 funciona, ya que es un valor l.

Ahora, si se usó un lvalue en un contexto donde el objeto en sí es necesario, se convertiría al valor almacenado en el objeto designado . Esto se denomina conversión lvalue , y el valor resultante, por supuesto, ya no es un valor l ( C11 6.3.2.1p2 ).