命名空间
变体
操作

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++11)    
(C++17)
数值限制
C 数值限制接口
运行时类型信息
 
定义于头文件 <cstddef>
typedef /*implementation-defined*/ ptrdiff_t;

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

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

(从 C++11 开始)

内容

[编辑] 注释

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

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

只有指向同一个数组元素的指针(包括指向数组末尾的下一个元素的指针)才能相互相减。

如果一个数组非常大(大于 PTRDIFF_MAX 个元素,但小于 SIZE_MAX 字节),使得两个指针之间的差异无法用 std::ptrdiff_t 表示,则减去两个指针的结果是未定义的。

对于小于 PTRDIFF_MAX 的字符数组,std::ptrdiff_t 充当 std::size_t 的带符号对应物:它可以存储任何类型的数组的大小,并且在大多数平台上与 std::intptr_t 同义。

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

[编辑] 可能的实现

// valid since 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) [编辑]
标准布局 类型的开头到指定成员的字节偏移量
(函数宏) [编辑]
C 文档 用于 ptrdiff_t