C 解引用指针是有效的左值吗?
假设定义如下:C 解引用指针是有效的左值吗?,c,pointers,lvalue,C,Pointers,Lvalue,假设定义如下: int i = 10; int *p = &i; 为什么这里*p是一个有效的左值: *p+=10; *p不应该计算为存储在&i处的int的值,即10,从而生成“非左值”错误吗 左值是指区域的表达式 可操纵的存储空间 *p是指存储区域的表达式。这不同于说10+=10因为10不像变量那样引用存储区域。我相信你对p的定义感到困惑p是指向int的指针类型的变量,其值初始化为i的地址 尽管如此,*p也是一个有效的左值—一个指向存储位置的有效表达式。用非常简单的话来说,指针指
int i = 10;
int *p = &i;
为什么这里*p是一个有效的左值:
*p+=10;
*p不应该计算为存储在&i处的int的值,即10,从而生成“非左值”错误吗
左值是指区域的表达式
可操纵的存储空间
*p
是指存储区域的表达式。这不同于说10+=10
因为10
不像变量那样引用存储区域。我相信你对p
的定义感到困惑<实际上,code>p是指向int的指针类型的变量,其值初始化为i
的地址
尽管如此,
*p
也是一个有效的左值—一个指向存储位置的有效表达式。用非常简单的话来说,指针指向一个对象(在一般的非OOP意义上),而不是该对象的内容。因此,是的,解引用指针是一个有效的左值
在非常低的水平上。指针只是一个内存地址,未引用的指针就是该地址的内存
*p
是否应该计算存储在&i
的int值,即10,从而生成“非左值”错误
简言之
*
表示“地址处的值”
*p
表示“地址上的值由p
的值给出”
*p=10
表示“将10设置为p
值给定的地址值”
左值是指存储在内存中某处的对象的表达式*p
也是一个表达式,它引用存储在位置p
的对象:
语义
*
运算符表示间接寻址。如果操作数指向函数,则结果为函数指示符如果它指向一个对象,结果是一个指定该对象的左值。如果操作数的类型为“指向类型的指针”,则结果的类型为“类型”。如果为指针指定了无效值,则一元*
运算符的行为未定义int i = 10;
int *p = &i;
*p
的结果是一个左值,用于指定对象i
因此,*p+=10
起作用,因为它是一个左值
现在,如果在需要对象本身的上下文中使用左值,它将转换为存储在指定对象中的值。这称为左值转换,结果值当然不再是左值()。我不知道你为什么被否决。我认为这是一个很好的问题,我一直认为
*p
是I
的同义词,从来没有遇到过任何混淆。*p
“当用作右值时,计算结果为&I
中存储的int值。但是作为一个左值,它与左值i
*p
的意思是“由p
指向的位置的内容”。将*p
解释为左值与右值之间的区别在于,当*p
显示为左值时,可以理解其目的是存储到p
所指的位置,当*p
用作右值时,可以理解其目的是检索p
@Kevin指向的内存位置的内容-我对*p
的内部心理解读是“指针p的对象”。也许有点罗嗦,但从心理上来说,这将*p+=10
转换为“指针的对象p递增10”。10是一个表达式。这不是左值。