【发布时间】:2021-10-30 18:35:35
【问题描述】:
我在查看Why can't you do bitwise operations on pointer in C, and is there a way around this? 并注意到大多数回复都说按位运算在指针上没有很好地定义,因为指针在标准中没有很好地定义。但是,这从未出现在我的任何系统类中,而且我不知道指针可以是指针指向的内存地址的值之外的任何东西。是否有任何 C 的实现,其中指针不表示为指针指向的内存地址?
是否有计划改变这一点,以便在未来的 C 标准中明确定义指针?
【问题讨论】:
-
已经有一些实现——虽然不幸的是我现在不能引用任何——已经实现了“智能指针”,其中指针是一个 3-5 字结构,不仅包含“真实”指针还有它指向的对象的基数和大小,以便可以进行数组边界检查。
-
有些系统的内存以复杂的形式寻址,甚至是更大的系统/处理器表示。例如分页或分段地址。在这种情况下,C 标准定义了一个 trap 表示,它可以是访问内存所需的任何类型的数据对象。那些复杂的数据对象不能用于标准的逻辑或数学运算。
-
我不认为“陷阱表示”是您想要的术语,@Frankie_C。正如语言规范中所使用的,这意味着“不需要表示对象类型的值的对象表示”。
-
对于它的价值,我认为问题不在于指针没有“明确定义”,而是它们的定义不包括任意算术运算符。不过,这并不是 C 标准最近强加的限制——据我所知,算术是从未为指针定义的,即使在 K&R 时代也是如此。例如,如果您正在编写链接器或内存管理器,您总是必须使用整数类型来保存您正在对其进行算术运算的内存地址。我认为所有的改变是你现在更有可能需要明确的演员表,而且
uintptr_t存在。 -
...因此,尽管我声称对标准的发展方式没有特别的了解,但我的猜测是指针的定义方式可能不会有太多变化。