C++ 中的 ptrdiff_t 详解
首先明确:ptrdiff_t 不是 C++ 关键字 ,它是标准库定义的类型别名 (typedef),属于有符号整数类型。
1. 核心定义
- 定义位置:在
<cstddef>头文件中(C++ 标准库) - 本质:
typedef定义的有符号整数类型别名 - 用途:专门用来表示两个指针之间的差值
2. 为什么需要它?
两个同类型指针相减(比如数组指针),结果是它们之间的元素个数 ,这个值可能是正数、负数或 0:
cpp
int arr[] = {10, 20, 30};
int* p1 = &arr[2];
int* p2 = &arr[0];
// p1 - p2 = 2(两个元素间隔)
// p2 - p1 = -2
ptrdiff_t diff = p1 - p2;
- 指针差值必须是有符号数 ,所以不能用无符号的
size_t - 不同平台的指针长度不同(32位/64位),
ptrdiff_t会自动适配平台,保证跨平台兼容性
3. 关键特性
- 有符号整数:可以表示正、负、零
- 平台适配:32位系统 = 32位有符号整数,64位系统 = 64位有符号整数
- 唯一合法类型 :C++ 标准规定,两个指针相减的结果类型必须是
ptrdiff_t
4. 常用场景
- 计算数组指针的差值
- 表示容器(如
vector)的迭代器差值 - 处理内存偏移量(需要负数偏移时)
5. 简单代码示例
cpp
#include <iostream>
// 必须包含这个头文件才能使用 ptrdiff_t
#include <cstddef>
int main() {
int nums[] = {1, 2, 3, 4, 5};
int* end = &nums[4];
int* start = &nums[1];
// 指针相减,用 ptrdiff_t 接收结果
ptrdiff_t distance = end - start;
std::cout << "指针差值:" << distance << std::endl; // 输出 3
std::cout << "类型大小:" << sizeof(ptrdiff_t) << " 字节" << std::endl;
return 0;
}
6. 和 size_t 的区别(高频考点)
| 类型 | 符号 | 主要用途 |
|---|---|---|
ptrdiff_t |
有符号 | 两个指针/迭代器的差值 |
size_t |
无符号 | 表示对象大小、数组长度 |
总结
- 不是关键字 ,是
<cstddef>中的标准类型别名 - 有符号整数 ,专门存储指针差值
- 跨平台兼容,是指针运算的标准类型
- 不要和无符号的
size_t混用