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

标签 c pointers lvalue

例如,

int x = 10;

我们知道标识符 x其作用就像一个标签,引用存储值 10 的对象。但为什么不能&x也可以称为引用同一对象的标签? &x是整个int的地址值存储值 10 的对象。所以我认为标识符 x&x与充当对象的标签没有什么区别。因此,我相信这给出了一个很好的理由说 &xlvalue 。因为根据 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 *vv.x 将被解释为 v[0].x

关于c - 为什么指针值不能成为引用内存空间中对象的好标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39055450/

相关文章:

c - 通过 argv 传递管道地址

objective-c - 为什么在 C 中使用 floor() 时类型定义了两次?

c - 结构中指针变量的大小

C++ 将数组传递给函数并读取其成员

c++ - 返回对右值临时的 const 左值引用?为什么这行得通?

c++ - C argv指针类型

将 4 个整数的结构转换为 float

C++ 字符数组 : error while copying data

c++ - 为什么 C++ 右值不是不可变的

c - 在不同编译器上具有显式宽度成员的结构对齐