C++ 中的 ptrdiff_t 详解

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. 关键特性

  1. 有符号整数:可以表示正、负、零
  2. 平台适配:32位系统 = 32位有符号整数,64位系统 = 64位有符号整数
  3. 唯一合法类型 :C++ 标准规定,两个指针相减的结果类型必须是 ptrdiff_t

4. 常用场景

  1. 计算数组指针的差值
  2. 表示容器(如vector)的迭代器差值
  3. 处理内存偏移量(需要负数偏移时)

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 无符号 表示对象大小、数组长度

总结

  1. 不是关键字 ,是 <cstddef> 中的标准类型别名
  2. 有符号整数 ,专门存储指针差值
  3. 跨平台兼容,是指针运算的标准类型
  4. 不要和无符号的 size_t 混用
相关推荐
H.莓飛6 小时前
【数据结构】排序_OJ题(一):计数、桶与排序后的处理
java·开发语言·数据结构
wangchunyu1146 小时前
JAVA AQS与Lock实现原理(含CAS)
java·开发语言·word
爱喝水的鱼丶7 小时前
SAP-ABAP:ECC→S/4HANA ABAP 迁移升级指南——程序改造、语法兼容与性能优化 导语
运维·开发语言·性能优化·sap·abap·经验交流·开发交流
小灰灰搞电子8 小时前
Rust+Slint 实现FTP客户端调试助手源码分享
开发语言·后端·rust
外收内放8 小时前
面向对象高级(实战案例)
开发语言·python·学习
·present·8 小时前
CSAPP(lecture 4_01)
c语言·c++
FPGA小迷弟8 小时前
用 Claude Code 重构遗留系统:从评估到落地的完整实践指南
c++·python·ai·plotly·django·ai编程·claude
fanruitian9 小时前
python else用法
开发语言·python
程序员-King.9 小时前
【ROS1】Noetic 开发工作流程与常用命令
c++·ubuntu·ros
FRing039 小时前
JavaScript入门到精通二十六(变量提升、函数剩余参数、展开运算符、ES6箭头函数)
开发语言·前端·javascript·es6·箭头函数