std::ptrdiff_t
来自cppreference.com
在标头 <cstddef> 定义
|
||
typedef /* 由实现定义 */ ptrdiff_t; |
||
std::ptrdiff_t
是两个指针相减结果的有符号整数类型。
|
(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) | |
从标准布局类型的起始到其指定成员的字节偏移量 (宏函数) |