Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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 为什么可以';t指针值是否是引用内存空间中对象的良好标签?_C_Pointers_Lvalue - Fatal编程技术网

C 为什么可以';t指针值是否是引用内存空间中对象的良好标签?

C 为什么可以';t指针值是否是引用内存空间中对象的良好标签?,c,pointers,lvalue,C,Pointers,Lvalue,比如说, int x = 10; 我们知道标识符x的作用类似于一个标签,它引用存储值10的对象。但是为什么&x不能被称为引用同一对象的标签呢&x是存储值10的整个int对象的地址值。所以我认为标识符x和&x在充当对象标签方面没有区别。因此,我认为这是一个很好的理由,可以说&x是一个左值。因为根据ISO C116.3.2.1,它说 左值是一个可能指定对象的表达式 但是为什么指针值&x不是左值 因为&x不是标签,所以它是指向标签值的指针 为了帮助您理解这一点的重要性,我将对不同类型的引用进行解释:

比如说,

int x = 10;
我们知道标识符
x
的作用类似于一个标签,它引用存储值
10
的对象。但是为什么
&x
不能被称为引用同一对象的标签呢
&x
是存储值
10
的整个
int
对象的地址值。所以我认为标识符
x
&x
在充当对象标签方面没有区别。因此,我认为这是一个很好的理由,可以说
&x
是一个
左值。因为根据ISO C116.3.2.1,它说

左值是一个可能指定对象的表达式


但是为什么指针值
&x
不是
左值

因为&x不是标签,所以它是指向标签值的指针

为了帮助您理解这一点的重要性,我将对不同类型的引用进行解释:

标签-也称为“别名”或“名称”,它们标识一些值或对象。在动态类型语言中,它们标识的值或对象可以更改;而在静态类型语言中,它保持不变。C中标签类型引用的一个例子是
intx

指针-指针标识某个值或对象的地址。这对于实现别名(对同一对象有多个引用)非常有用。C中指针类型引用的一个例子是
int*x
&x

句柄-句柄是某个值或对象的唯一标识符(通常为整数)。像指针一样,它们允许使用别名;但是句柄不能像指针一样被取消引用。这非常有用,因为它可以用来隐藏数据结构的底层实现,并允许内存管理器安全地重新安排内存(例如碎片整理),以提高缓存一致性并提高性能。C中句柄类型引用的一个例子是POSIX
open
函数返回的
int


离题:在Golang中,当您尝试分配给指针类型对象的成员时,它会自动取消引用;因此不需要
->
操作符。对于
vec2*v
v.x
将被解释为
v[0].x

,因为这是语言的设计方式。你的地址不是你自己。@KarolyHorvath,但我想同样的逻辑也适用于
x
我不认为
&x
指定对象,但我必须查找“对象”的确切定义@Jin:再来一次-你可以给
x
赋值。不能将新值分配给
&x
。这就是区别。表达式
&x
不指定内存中的对象-它指定内存中对象的地址,您不能修改地址
&x
可能不是作业的目标,因此它不能是左值。哇,感谢您对不同类型的参考文献进行解释!