例如,
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 不是标签,它是指向标记值的指针。
为了帮助您理解为什么这很重要,我将解释不同类型的引用文献:
标签 - 也称为“别名”或“名称”,它们标识某些值或对象。在动态类型语言中,它们标识的值或对象可以改变;而在静态类型语言中,它保持不变。 C 中标签类型引用的一个示例是 int x;
指针 - 指针标识某个值或对象的地址。这对于实现别名(对同一对象有多个引用)很有用。 C 中指针类型引用的示例为 int *x;
或 &x
句柄 - 句柄是某个值或对象的唯一标识符(通常是整数)。像指针一样,它们允许别名;但句柄不能像指针一样取消引用。这是非常有用的,因为它可以用来隐藏数据结构的底层实现,并允许内存管理器安全地重新排列内存(例如碎片整理)以提高缓存一致性并提高性能。 C 中句柄类型引用的一个示例是 POSIX open
函数返回的 int
值。
题外话:在Golang中,当你尝试给指针类型对象的成员赋值时,它会自动取消引用;所以不需要 ->
运算符。对于 vec2 *v
,v.x
将被解释为 v[0].x
。
关于c - 为什么指针值不能成为引用内存空间中对象的好标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39055450/