为什么指针值不能成为引用内存中对象的好标签 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 *v
,v.x
将被解释为 v[0].x
。
例如,
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 *v
,v.x
将被解释为 v[0].x
。