std::ptrdiff_t

来自cppreference.com
< cpp‎ | types
 
 
工具库
语言支持
类型支持(基本类型、RTTI)
库功能特性测试宏 (C++20)
动态内存管理
程序工具
协程支持 (C++20)
变参数函数
调试支持
(C++26)
三路比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
初等字符串转换
(C++17)
(C++17)

 
类型支持
基本类型
定宽整数类型 (C++11)
定宽浮点类型 (C++23)
ptrdiff_t
(C++17)
数值极限
C 数值极限接口
运行时类型信息
 
在标头 <cstddef> 定义
typedef /* 由实现定义 */ ptrdiff_t;

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

std::ptrdiff_t 的位宽不小于 17。

(C++11 起)

注解

std::ptrdiff_t 被用于指针算术及数组下标,如果允许出现负值。程序使用如 int 的其他类型,当索引超过 INT_MAX 或依赖 32 位模算术时,可能在 64 位系统失败。

在使用 C++ 容器库时,迭代器的差的正确类型是成员 typedef difference_type,它通常与 std::ptrdiff_t 相同。

只有指向同一数组元素的指针(包括指向数组结尾后一位置的指针)才可以相减。

若数组过大(大于 PTRDIFF_MAX 个元素,而小于 SIZE_MAX 字节),则两个指针的差可能无法以 std::ptrdiff_t 表示,这两个指针相减的结果是未定义的。

对于短于 PTRDIFF_MAX 的 char 数组,std::ptrdiff_t 表现为 std::size_t 的有符号对应物:它可以存储数组的大小,而且在多数平台上等同于 std::intptr_t

未指定 std::ptrdiff_t 的声明是否在任何其他标准库头文件中可用。即使当标准要求使用 std::ptrdiff_t 时,实现仍可避免引入此名字。

可能的实现

// C++11 起合法
using ptrdiff_t = decltype(static_cast<int*>(nullptr) - static_cast<int*>(nullptr));

示例

#include <cstddef>
#include <iostream>
 
int main()
{
    const std::size_t N = 10;
    int* a = new int[N];
    int* end = a + N;
    for (std::ptrdiff_t i = N; i > 0; --i)
        std::cout << (*(end - i) = i) << ' ';
    std::cout << '\n';
    delete[] a;
}

输出:

10 9 8 7 6 5 4 3 2 1

参阅

sizeof 运算符返回的无符号整数类型
(typedef)
从标准布局类型的起始到其指定成员的字节偏移量
(宏函数)