【问题标题】:Does the C standard require pointers to be (integer) numbers?C标准是否要求指针是(整数)数字?
【发布时间】:2019-12-25 14:10:17
【问题描述】:

C 标准是否要求指针是(整数)数字?

有人可能会说是的,因为指针算法......

但是另一方面,像--++ 这样的操作可能被理解为上一个内存位置下一个内存位置,这取决于它们在标准和实际实现可以使用任何表示来保存指针数据(只要实现了提到的操作)......

想到另一个问题 - C 是否要求数组/缓冲区等是连续的,即下一个元素存储在 下一个内存位置++p 其中 p 是一个指针)?我问是因为您经常可以在网上看到似乎假设它确实存在的实现。

【问题讨论】:

  • 指针不是整数,而是作为数值处理。比如你将如何表示一个机器地址?!
  • C 标准使用术语抽象机。实际的实现只与(硬件)实现者相关。
  • @VladfromMoscow 好吧,例如:可以想象一台机器可以像我们寻址我们的家一样寻址内存单元。这很愚蠢,但有可能。
  • “C 是否要求数组/缓冲区等是连续的” 是的,“数组类型描述了一组连续分配的非空对象...” (C11)

标签: c pointers memory standards


【解决方案1】:

不,指针不必是纯数字。

如果您阅读该标准,则有相关规定:

  1. 两个指向不相关对象的指针(意思是不是更大对象的一部分,记住结构和数组)不能比较,除非相等。

    6.5.8 关系运算符

    [...]
    5 比较两个指针时,结果取决于所指向对象在地址空间中的相对位置。如果两个指向对象或不完整类型的指针都指向同一个对象,或者都指向同一个数组对象的最后一个元素,它们比较相等。如果指向的对象是同一个聚合对象的成员,则指向稍后声明的结构成员的指针比指向结构中较早声明的成员的指针要大,并且指向具有较大下标的数组元素的指针 值比较大于指向具有较低下标值的同一数组的元素的指针。所有指向同一个联合对象成员的指针比较相等。如果表达式P 指向一个数组对象的元素,而表达式Q 指向同一个数组对象的最后一个元素,则指针表达式Q+1 比较大于P。在所有其他情况下,行为是未定义的。

  2. 两个指向不相关对象的指针不能相减。

    6.5.6 加法运算符

    [...]
    9 当两个指针相减时,都应指向同一个数组对象的元素,或者指向数组对象的最后一个元素;结果是两个数组元素的下标不同。结果的大小由实现定义,其类型(有符号整数类型)为ptrdiff_t,在<stddef.h> 标头中定义。如果结果在该类型的对象中不可表示,则行为未定义。换句话说,如果表达式PQ分别指向数组对象的第ij元素,则表达式@ 987654329@ 的值为 i-j,前提是该值适合 ptrdiff_t 类型的对象。此外,如果表达式P 指向数组对象的一个​​元素或数组对象的最后一个元素,而表达式Q 指向同一数组对象的最后一个元素,则表达式((Q)+1)-(P)有相同的 值作为((Q)-(P))+1-((P)-((Q)+1)),如果表达式P 指向数组对象的最后一个元素后一个,则值为零,即使表达式(Q)+1 不指向数组对象的元素.91)

  3. 可能没有办法将指针表示为数字,因为可能不存在合适的类型。因此,尝试转换可能会导致未定义的行为。

    任何定义行为的特定实现并不意味着它不是标准的UB。

    6.3.2.3 指针

    [...]
    6 任何指针类型都可以转换为整数类型。除非前面指定,结果是实现定义的。如果结果不能以整数类型表示,则行为未定义。结果不必在任何整数类型的值范围内。

    7.18.1.4 能够保存对象指针的整数类型

    1 以下类型指定了一个有符号整数类型,其属性是任何指向void的有效指针都可以转换为该类型,然后转换回指向void的指针,结果将与原始指针进行比较:

    intptr_t
    

    以下类型指定一个无符号整数类型,其属性是任何指向void的有效指针都可以转换为该类型,然后转换回指向void的指针,结果将与原始指针进行比较:

    uintptr_t
    

    这些类型是可选的。

这只是我的想法,我相信还有更多。

所有引述来自 n1256(C99 草案)。

数组一直被要求是连续的。

【讨论】:

    【解决方案2】:

    要回答您在数组中的第二个问题,元素位于连续的内存位置。这就是你使用指针算法在元素之间移动的原因。

    【讨论】:

      猜你喜欢
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 2016-03-30
      • 2013-12-17
      • 2020-11-25
      • 2016-04-23
      • 2016-12-10
      相关资源
      最近更新 更多