【问题标题】:C++ implicit conversion of pointer type指针类型的C++隐式转换
【发布时间】:2015-05-07 08:25:29
【问题描述】:

考虑这种情况:

int *ptr;
int offset;
ptr = <some_address>;
offset = 10;

假设 offset 是 32 位变量。 ptr 的类型为 int*,目标架构是 64 位的(所以 ptr 是 8 字节的变量),offset 的类型为 int。计算表达式*(ptr + offset)的值时会进行什么转换?我在哪里可以阅读 2003 C++ 标准中的相关内容?

【问题讨论】:

  • offset 变量应转换为std::ptrdiff_t
  • 我猜较小的整数变量会被提升,对于 offsetintsize_t/std::ptrdiff_t (正如 Joachim Pileborg 指出的)对于 ptr
  • 我考虑过推广,但在 2003 C++ 标准中没有发现任何关于这个特殊情况的信息。
  • Fwiw,指针 type 应该无关紧要(谁在乎它是否指向 __int64char 或介于两者之间的任何东西)。可能存在 alignment 问题,但这似乎与您的问题无关。它是一个指针根本当然是相关的。如果您想说“假设平台数据指针是 64 位,而平台 int 是 32 位,您可能应该直接说出来(至少我认为您的意思是这样)。
  • @WhozCraig,编辑了问题。谢谢你的评论。

标签: c++ implicit-conversion pointer-conversion


【解决方案1】:

这就是标准对这个 [expr.add]/4 所说的话:

当一个整数类型的表达式被添加到指针或从指针中减去时,结果具有指针操作数的类型。如果指针操作数指向数组 object84 的元素,并且数组足够大,则结果指向与原始元素偏移的元素,使得结果和原始数组元素的下标之差等于积分表达式。换句话说,如果表达式 P 指向数组对象的第 i 个元素,则表达式 (P)+N(等效于 N+(P))和 (P)-N(其中 N 的值为 n)指向分别表示数组对象的第 i + n 个和 i ≠ n 个元素,前提是它们存在。

简单来说,这意味着ptr指向的地址在你写ptr + offset时增加了offset * sizeof(*ptr)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    相关资源
    最近更新 更多