Namespaces
Variants

ptrdiff_t

From cppreference.net
< c ‎ | types
定义于头文件 <stddef.h>
typedef /*由实现定义*/ ptrdiff_t ;

ptrdiff_t 两个指针相减 结果的有符号整数类型。

ptrdiff_t 的位宽不小于17。

(since C99)
(until C23)

ptrdiff_t 的位宽不小于16。

(since C23)

目录

注释

ptrdiff_t 用于指针运算和数组索引(当可能存在负值时)。若使用其他类型(如 int )的程序,在索引超过 INT_MAX 或依赖32位模运算时,可能在64位系统上运行失败。

只有指向同一数组元素的指针(包括指向数组末尾后一位置的指针)才能相互进行减法运算。

如果数组过大(元素数量超过 PTRDIFF_MAX 但字节数不超过 SIZE_MAX ),导致两个指针的差值无法用 ptrdiff_t 类型表示,那么对这两个指针进行相减操作的结果是未定义的。

对于长度小于 PTRDIFF_MAX 的字符数组, ptrdiff_t 作为 size_t 的有符号对应类型:它能存储任何类型数组的大小,并且在大多数平台上与 intptr_t 同义)。

可能的实现

typedef typeof((int*)nullptr - (int*)nullptr) ptrdiff_t; // 自 C23 起有效

示例

#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
int main(void)
{
    const size_t N = 100;
    int numbers[N];
    printf("PTRDIFF_MAX = %ld\n", PTRDIFF_MAX);
    int *p1 = &numbers[18], *p2 = &numbers[23];
    ptrdiff_t diff = p2 - p1;
    printf("p2-p1 = %td\n", diff);
}

可能的输出:

PTRDIFF_MAX = 9223372036854775807
p2-p1 = 5

参考文献

  • C23 标准 (ISO/IEC 9899:2024):
  • 7.19 通用定义 <stddef.h> (页: TBD)
  • 7.20.3 其他整数类型的限制 (页: TBD)
  • C17 标准 (ISO/IEC 9899:2018):
  • 7.19 通用定义 <stddef.h> (页: 211)
  • 7.20.3 其他整数类型的限制 (页: 215)
  • C11 标准 (ISO/IEC 9899:2011):
  • 7.19 通用定义 <stddef.h> (页码: 288)
  • 7.20.3 其他整数类型的限制 (页码: 293)
  • C99标准(ISO/IEC 9899:1999):
  • 7.17 通用定义 <stddef.h>(页码:253)
  • 7.18.3 其他整数类型的限制(页码:258)
  • C89/C90 标准 (ISO/IEC 9899:1990):
  • 4.1.6 通用定义 <stddef.h>

参见

sizeof 运算符返回的无符号整数类型
(typedef)
从结构体类型起始处到指定成员的字节偏移量
(函数宏)
C++ documentation for ptrdiff_t