size_t和ptrdiff_t类型的变量

Ric*_*ich 20 c c++ size-t

通过阅读在网上的职位相关的size_tptrdiff_t,我想确认以下内容:

  1. 如果一个数组的最大大小小于1/2*(max number represent-able by size_t),我可以安全地使用ptrdiff_t并检查指向同一个对象的两个指针之间的相对距离吗?(因为我在谈论数组,"指向同一个对象的指针"意味着"指向同一个数组的指针") .

  2. 如果我想声明一个可以表示来自另一个指针的偏移量的变量,我最好将其声明为类型ptrdiff_t

  3. 如何输出类型size_tptrdiff_tC和C++中的变量?以下是否正确:size_t类型的变量的跨平台格式字符串?

  4. 是OR的uintptr_t另一个名称size_t它应该作为一个单独的类型使用size_t

  5. ssize_t和OR的intptr_t另一个名称ptrdiff_t必须以不同的方式使用?

我开始在Ubuntu上使用gcc.我在使用别人的代码时发现了这些类型.

ADDed:我确实希望能够使用补偿.使用uintptr_t和任何差异intptr_t

Mik*_*our 20

1:如果数组的最大大小小于1/2*(最大数字表示能力size_t),我可以安全地使用ptrdiff_t并检查两个指向同一对象的指针之间的相对距离吗?

如果是这样的话sizeof(size_t) <= sizeof(prtdiff_t).在合理的实施中将是这种情况,但不能保证.

2:如果我想声明一个可以表示来自另一个指针的偏移量的变量,我最好将其声明为类型ptrdiff_t

是的,这就是该类型的用途.

3:如何在C和C++中输出size_t和ptrdiff_t类型的变量?

在C:

printf("%zu %td\n", size, ptrdiff);
Run Code Online (Sandbox Code Playgroud)

在C++中:

std::cout << size << ' ' << ptrdiff << '\n';
Run Code Online (Sandbox Code Playgroud)

4:是OR的uintptr_t另一个名称size_t它应该用作单独的类型size_t吗?

它应该被视为一种单独的类型.uintptr_t是一个整数类型,可以包含转换为整数的任何指针值; 它可能不存在于某些平台上.

5:是ssize_t和OR的其他intptr_t名称ptrdiff_t必须以不同的方式使用?

ssize_t就C或C++语言而言,它不是标准类型; 它由Posix定义为一些函数参数和返回值的类型.ptrdiff_t除了直接处理Posix函数时,最好使用.

intptr_t用于保存指针的整数表示,而不是指针之间的差异.在某些平台上,这些可能具有不同的大小,并且intptr_t可能根本没有定义,因此它们不应互换使用.

我确实希望能够使用负补偿.使用uintptr_t和任何差异intptr_t

不要使用这些类型中的任何一种来表示偏移量; 用ptrdiff_t.在特殊情况下,当您希望将指针转换为其整数表示形式时,请使用这些类型.

  • +1.你可以使用`size_t`代替`ptrdiff_t`,如果你只是要处理来自基指针的正偏移(在我的工作中通常就是这种情况).如果您可能需要负偏移,那么`ptrdiff_t`是要使用的正确类型. (2认同)