Namespaces
Variants

std:: ptrdiff_t

From cppreference.net
Utilities library
定义于头文件 <cstddef>
typedef /*由实现定义*/ ptrdiff_t ;

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

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

(since C++11)

目录

注释

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

在使用C++容器库时,迭代器差值对应的正确类型是成员类型定义 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 ,实现也可以避免引入该名称。

可能的实现

// 自 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