C++ ptrdiff_t

一、定义

ptrdiff_t 是 C/C++ 标准库中定义的一个与机器相关的数据类型。ptrdiff_t 类型变量通常用来保存两个指针减法操作的结果。ptrdiff_t 定义在 stddef.hcstddef)这个文件内。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; // diff是ptrdiff_t类型

二、ptrdiff_tsize_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(); // 100
ptrdiff_t diff = vec.end() - vec.begin(); // 100

// 有符号到无符号转换
size_t s = static_cast<size_t>(diff); // 安全,因为diff >= 0

// 无符号到有符号转换(危险!)
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; // 3
ptrdiff_t diff2 = p2 - p1; // -3

// 负数的ptrdiff_t是有效的
if (diff2 < 0) {
std::cout << "p2在p1之前" << std::endl;
}

C++ ptrdiff_t
http://example.com/2026/05/26/C++-ptrdiff-t/
作者
Yu xin
发布于
2026年5月26日
许可协议