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

C标准要求指针是(整数)数字吗?,c,pointers,memory,standards,C,Pointers,Memory,Standards,C标准要求指针是(整数)数字吗 有人可能会说是的,因为指针运算 但另一方面,像--或++这样的操作可以理解为上一个内存位置,下一个内存位置,这取决于它们在标准中的描述方式,并且实际实现可以使用任何表示来保存指针数据(只要实现了提到的操作) 另一个问题浮现在脑海中-C是否要求数组/缓冲区等是连续的,即下一个元素存储在下一个内存位置(++p,其中p是指针)?我之所以这么问,是因为您经常可以在网上看到一些实现,这些实现似乎都是假设的。不,指针不必是纯数字 如果您阅读本标准,则有以下规定: 除非相等,否

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

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

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


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

不,指针不必是纯数字

如果您阅读本标准,则有以下规定:

  • 除非相等,否则不能比较指向不相关对象的两个指针(这意味着不是较大对象的一部分,请记住结构和数组)

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

  • 不可减去指向不相关对象的两个指针

    6.5.6加法运算符 […]
    9当两个指针相减时,两个指针都应指向同一数组对象的元素,或指向数组对象最后一个元素之后的元素;结果是两个数组元素的下标不同。结果的大小由实现定义,其类型(有符号整数类型)由
    标题定义。如果结果无法在该类型的对象中表示,则行为是不确定的。换句话说,如果表达式
    P
    Q
    分别指向数组对象的第i和第j个元素,则表达式
    (P)-(Q)
    的值为i−j提供类型为
    ptrdiff\u t
    的对象中的值。此外,如果表达式
    P
    指向数组对象的一个元素或数组对象最后一个元素之后的一个元素,并且表达式
    Q
    指向同一数组对象的最后一个元素,则表达式
    ((Q)+1)-(P)
    具有相同的属性 值为
    ((Q)-(P))+1
    -((P)-(Q)+1))
    ,如果表达式
    P
    指向数组对象的最后一个元素,则值为零,即使表达式
    (Q)+1
    未指向数组对象的元素。91)

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

    定义行为的任何特定实现并不意味着它不符合标准

    6.3.2.3指针 […]
    6任何指针类型都可以转换为整数类型。除先前规定的情况外,结果为实施情况。如果结果不能以整数类型表示,则行为未定义。结果不必在anyinteger类型的值范围内

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

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

    intptr_t
    
    uintptr_t
    
    这些类型是可选的

  • 这是我脑子里想不出来的,我相信还有更多

    n1256(C99草稿)的所有报价


    数组总是要求是连续的。

    不,指针不必是纯数字

    如果您阅读本标准,则有以下规定:

  • 除非相等,否则不能比较指向不相关对象的两个指针(这意味着不是较大对象的一部分,请记住结构和数组)

    6.5.8关系运算符 […]
    5比较两个指针时,结果取决于指向的对象在地址空间中的相对位置。如果指向对象的两个指针或不完整类型都指向同一对象,或者都指向同一数组对象的最后一个元素,则它们的比较相等。如果指向的对象是同一聚合对象的成员,则指向后来声明的结构成员的指针要比指向结构中先前声明的成员的指针大,指向下标较大的数组元素的指针要大 值比指向具有较低下标值的相同数组元素的指针大。指向同一联合对象成员的所有指针比较相等。如果表达式
    P
    指向数组对象的元素