为什么指针值不能成为引用内存中对象的好标签 space?

Why can't pointer value be a good label to refer object in memory space?

例如,

int x = 10;

我们知道标识符 x 就像一个标签,它引用存储值 10 的对象。但是为什么 &x 也不能称为引用同一对象的标签呢? &x是整个int对象的一个​​地址值,存储了值10。所以我觉得标识符x&x在起到对象的标签作用上没有区别。因此,我相信这给出了一个很好的理由说 &x 是一个 lvalue。因为根据 ISO C11 6.3.2.1,它表示

lvalue is an expression that potentially designates an object.

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

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

为了帮助您理解为什么这很重要,我将解释不同类型的引用:

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

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

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

题外话:在Golang中,当你尝试赋值给一个指针类型对象的成员时,它会被自动解引用;所以不需要 -> 运算符。对于 vec2 *vv.x 将被解释为 v[0].x