Is a dereferenced pointer a valid lvalue?

浪尽此生 提交于 2019-11-29 06:07:07

问题


Assuming the definition:

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

Why is *p a valid lvalue here:

*p+=10; 

Shouldn't *p evaluate to the value of the int stored at &i, ie. 10, and hence generate a "Not an lvalue" error?


回答1:


An lvalue is an expression that refers to a region of storage that can be manipulated.

*p is such an expression that refers to a region of storage. This is different than say 10+=10; because 10 doesn't refer to a region of storage like a variable would.




回答2:


I believe you are confused with the definition of p. p is, in fact, a variable of type pointer to int, and its value is initialized to the address of i.

Nonetheless, *p is a valid lvalue as well - a valid expression to a storage location.




回答3:


In very simple words, pointers point to an object (in a general, non OOP sense), not to the contents of that object. So yes, a dereferenced pointer is a valid lvalue.

In very low level terms. A pointer is nothing but a memory address, a dereferenced pointer is the memory at that address.




回答4:


Shouldn't *p evaluate to the value of the int stored at &i, ie. 10, and hence generate a "Not an lvalue" error?

In simple words,

* means "value at address".

*p means "value at address given by the value of p".

*p = 10; means "set 10 as the value at address given by the value of p".

lvalue is an expression that refers to an object stored somewhere in the memory. *p is also an expression that refers to an object stored at location p.




回答5:


C11 6.5.3.2p4:

Semantics

...

  1. The unary * operator denotes indirection. If the operand points to a function, the result is a function designator; if it points to an object, the result is an lvalue designating the object. If the operand has type ''pointer to type'', the result has type ''type''. If an invalid value has been assigned to the pointer, the behavior of the unary * operator is undefined

I.e. with

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

the result of *p is an lvalue that designates the object i.

Therefore *p += 10 works, as it is an lvalue.

Now, if an lvalue were used in a context where the object itself is needed, it would be converted to the value stored in the designated object. This is called the lvalue conversion, and the resulting value of course isn't an lvalue anymore (C11 6.3.2.1p2).



来源:https://stackoverflow.com/questions/4773839/is-a-dereferenced-pointer-a-valid-lvalue

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!