一文带你快速了解C/C++标准库中的ptrdiff_t

 更新时间:2022年11月11日 10:52:12   作者:康来个程  
ptrdiff_t是C/C++标准库中定义的一个与机器相关的数据类型,ptrdiff_t类型变量通常用来保存两个指针减法操作的结果,下面这篇文章主要给大家介绍了关于C/C++标准库中ptrdiff_t的相关资料,需要的朋友可以参考下

简介

ptrdiff_t是C/C++标准库中定义的一个与机器相关的数据类型。ptrdiff_t类型变量通常用来保存两个指针减法操作的结果。

ptrdiff_t定义在stddef.h(cstddef)这个文件内。

ptrdiff_t通常被定义为long int类型。

ptrdiff_t定义在C99标准中。

标准库类型(library type)ptrdiff_t 与 size_t 类型一样,ptrdiff_t也是一种与机器相关的类型,在 cstddef标准库头文件中定义。size_t 是unsigned 类型,而 ptrdiff_t 则是 signed 整型。

这两种类型的差别体现了它们各自的用途:size_t类型用于指明数组长度,它必须是一个正数;ptrdiff_t 类型则应保证足以存放同一数组中两个指针之间的差距,它有可能是负数。

示例

#include <stdio.h>
#include <stddef.h>
#include <string.h>
 
int main(void)
{
    char str[] = "Hello world!";
    char* pstart = str;
    char* pend = str + strlen(str);
    ptrdiff_t difp = pend - pstart;
    printf("%d\n", difp);
    return 0;
}

存在的意义?

在编译器中我尝试过用int接收两个指针的差距离,既然可以用int来表示,那他存在的意义是什么的,难道只是优雅吗?(优雅还是很重要的!)

size_t/ptrdiff_t数据类型是和机器相关的。其sizeof字节长度和指针字节长度是一致的。

根据上表,我们可以看到指针的字节长度:

  • 16 bit系统中,占用2字节(arduino nano)
  • 64 bit系统中,占用8字节(vc64/ios模拟器)
  • 32 bit系统中,占用4字节(除了上述3个系统外)

这种与机器类型相关的数据类型,我们可以称为机器相关数据类型

如果现在有个需求,我需要跨平台的使用统一数据类型来表示指针地址范围,该怎么办?

答: 两种方式:

  • typedef long long int64;
    使用最大字节长度的数据类型来容纳各个平台下的地址数据
  • 使用c/c++预先定义的机器相关数据类型: size_t/ptrdiff_t

补充:ptrdiff_t与size_t的区别

标准库类型(library type)ptrdiff_t 与 size_t 类型一样,ptrdiff_t 也是一种与机器相关的类型,在cstddef 头文件中定义。

size_t 是unsigned 类型,而 ptrdiff_t 则是 signed 整型

size_t类型用于指明数组长度,它必须是一个正数;ptrdiff_t 类型则应保证足以存放同一数组中两个指针之间的差距,它有可能是负数

总结

到此这篇关于C/C++标准库中ptrdiff_t的文章就介绍到这了,更多相关C/C++标准库中ptrdiff_t内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • C++11中std::future的具体使用方法

    C++11中std::future的具体使用方法

    这篇文章主要介绍了C++11中std::future的具体使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • C语言邻接表建立图详解

    C语言邻接表建立图详解

    这篇文章主要介绍了C语言邻接表建立图,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • C++ Boost MetaStateMachine定义状态机超详细讲解

    C++ Boost MetaStateMachine定义状态机超详细讲解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-12-12
  • 深入理解C++中public、protected及private用法

    深入理解C++中public、protected及private用法

    这篇文章主要介绍了C++中public、protected及private用法,对于C++面向对象程序设计来说是非常重要的概念,需要的朋友可以参考下
    2014-08-08
  • C++调用libcurl开源库实现邮件的发送功能流程详解

    C++调用libcurl开源库实现邮件的发送功能流程详解

    libcurl是一个免费开源的网络传输库,支持ftp、ftps、tftp,http、https、telnet、ldap、pop3、smtp等多种协议,接下来让我们一起来了解吧
    2021-11-11
  • 详解C++11中绑定器bind的原理与使用

    详解C++11中绑定器bind的原理与使用

    C++11中引入的function机制,其中绑定器主要有三种:bind1st、bind2nd、bind(C++11)。本文就来和大家聊聊这些绑定器的底层实现原理与使用场景,需要的可以参考一下
    2022-12-12
  • Cocos2d-x 3.x入门教程(二):Node节点类

    Cocos2d-x 3.x入门教程(二):Node节点类

    这篇文章主要介绍了Cocos2d-x 3.x入门教程(二):Node节点类,本文对Node节点类做了一个简明讲解及Node类提供的函数做了说明,需要的朋友可以参考下
    2014-11-11
  • C++的new和delete详解

    C++的new和delete详解

    这篇文章主要介绍的是C++的new和delete,可以这么理解 new相当于是malloc 、delete相当于是free,下面我们就来详情介绍,,需要的朋友可以参一考
    2021-09-09
  • Mygui中文换行问题解决方案

    Mygui中文换行问题解决方案

    相信大家解决了中文输入后一定会遇到如何解决中文输入的问题,中文输入换行问题是很多gui框架都存在的一个问题,需要的朋友可以了解下
    2012-11-11
  • C++利用stringstream进行数据类型转换实例

    C++利用stringstream进行数据类型转换实例

    这篇文章主要介绍了C++利用stringstream进行数据类型转换的方法,实例分析了使用stringstream进行string转int的操作技巧,需要的朋友可以参考下
    2015-01-01

最新评论