一、定义
ptrdiff_t 是 C/C++ 标准库中定义的一个与机器相关的数据类型。ptrdiff_t 类型变量通常用来保存两个指针减法操作的结果。ptrdiff_t 定义在 stddef.h(cstddef)这个文件内。ptrdiff_t 通常被定义为 long int 类型。
1 2 3
| #include <cstddef>
ptrdiff_t diff = pointer1 - pointer2;
|
1 2 3 4 5
| int arr[10]; int* p1 = &arr[2]; int* p2 = &arr[5];
auto diff = p2 - p1;
|
二、ptrdiff_t 与 size_t
与 size_t 的区别:
| 类型 |
符号 |
用途 |
示例 |
ptrdiff_t |
有符号 |
指针差值、迭代器距离 |
p2 - p1 |
size_t |
无符号 |
大小、容量、索引 |
sizeof(arr) |
三、应用
在 STL 中,迭代器的差值类型就是 ptrdiff_t:
1 2 3 4 5 6 7 8 9
| template<typename T> class iterator { public: typedef T value_type; typedef T* pointer; typedef T& reference; typedef ptrdiff_t difference_type; typedef std::random_access_iterator_tag iterator_category; };
|
迭代器特征类:
1 2 3 4 5 6 7 8 9 10 11 12
| template<typename Iterator> struct iterator_traits { typedef typename Iterator::difference_type difference_type; };
template<typename T> struct iterator_traits<T*> { typedef ptrdiff_t difference_type; };
|
四、注意事项
4.1 指针相减的限制
1 2 3 4 5 6 7
| int arr1[10]; int arr2[10]; int* p1 = arr1 + 5; int* p2 = arr2 + 3;
ptrdiff_t diff = p1 - p2;
|
4.2 与 size_t 的转换
1 2 3 4 5 6 7 8 9
| std::vector<int> vec(100); size_t size = vec.size(); ptrdiff_t diff = vec.end() - vec.begin();
size_t s = static_cast<size_t>(diff);
ptrdiff_t d = static_cast<ptrdiff_t>(size);
|
4.3 负数的情况
1 2 3 4 5 6 7 8 9 10 11
| int arr[10]; int* p1 = arr + 5; int* p2 = arr + 2;
ptrdiff_t diff1 = p1 - p2; ptrdiff_t diff2 = p2 - p1;
if (diff2 < 0) { std::cout << "p2在p1之前" << std::endl; }
|