Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 解引用指针是有效的左值吗?_C_Pointers_Lvalue - Fatal编程技术网

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是一个表达式。这不是左值。