【问题标题】:Pointer incrementing in C++C++中的指针递增
【发布时间】:2011-09-23 11:01:29
【问题描述】:

这是什么意思:指针增量指向指针的下一个基类型的地址?
例如:

p1++;  // p1 is a pointer to an int

此语句是否意味着p1 指向的地址应该更改为下一个int 的地址,或者它应该只是增加2(假设int 是2 个字节),在这种情况下特定地址可能不包含int?
我的意思是,如果p1 是0x442012,那么p1++ 将是0x442014(可能是双精度地址的一部分)还是会指向下一个int,它位于类似0x44201F 的地址中?

谢谢

【问题讨论】:

    标签: c++ pointers increment


    【解决方案1】:

    p1++ 产生汇编语言指令,将 p1 增加它所指向的大小。所以你得到了

    (char *)p1 = (char *)p1 + sizeof (object pointed to by p1)

    (当这个问题被回答时)通常一个 int 是 4 个字节,所以它会增加 4,但这取决于你机器上的 sizeof()。

    它确实进入“下一个int”。

    一个例子:假设一个 4 字节的地址和 p1 = 0x20424(其中 p1 是一个 int*)。那么

    p1++

    将 p1 的新值设置为 0x20428。不是 0x20425。

    【讨论】:

    • 没有。 p1++ 表示p1 += 1,仅此而已。
    • @Konrad:好吧,除非你重载了 ++ 运算符。啊,乐趣正在重新定义运营商的意义(以及制造敌人的好方法);-)
    • @Skizz 即使这样也不会改变含义,因为您不能更改运算符的含义,所以在指针上,++ 将始终具有相同的效果。
    • @GregSchmit 这不是指针运算的工作原理。 p++ 将指针值加 1。但是您(和 Scott)似乎认为 1 指的是 1 byte。它没有。看我的回答。
    • @GregSchmit 啊,这就是混乱的根源。所以:指针是 not 无符号整数。指针是指针——一种不同的类型! 在底层,许多/所有平台都将指针实现为无符号整数。但是p++ 不是在后台执行的,它是在 C++ 空间中执行的。它相当于p += 1,而不是p += 4 或其他任何东西。 p += 1 反过来被在后台转换为指针值按指针对象大小的增量。当然his并不总是4,和地址实现的类型无关。
    【解决方案2】:

    如果p1 指向int 类型对象数组的索引n 的元素(为此目的,非数组对象计为长度为1 的数组),那么在p1++ 之后, p1 是:

    • 如果数组长度大于n+1,则指向索引n+1 的元素。
    • 如果数组的长度正好为n+1,则为数组的“过去”地址。

    如果p1 未指向int 类型的对象数组的元素,p1++ 将导致未定义的行为。

    C 和 C++ 语言赋予“地址”概念的唯一含义是指针对象的值。

    C/C++ 的地址概念与您在汇编语言中考虑的数字地址概念之间的任何关系纯粹是一个实现细节(尽管是一个极其常见的实现细节)。

    【讨论】:

      【解决方案3】:

      编译器会将sizeof(int)(通常为4)添加到指针的数值上。如果 p1 在增量之前是 0x442012,那么在增量之后它将是 0x442012 + 4 = 0x442016。

      请注意,0x442012 不是 4 的倍数,因此它不太可能是有效的四字节 int 的地址,尽管它对您的两字节 int 来说没问题。

      它肯定不会去寻找下一个整数。那需要魔法。

      【讨论】:

        【解决方案4】:

        指针算法不关心被指针的内容或有效性。它将使用以下公式简单地增加指针地址:

        new_value = reinterpret_cast<char*>(p) + sizeof(*p);
        

        (假设一个指向非const 的指针——否则强制转换不起作用。)

        也就是说,它会将指针增加sizeof(*p) 字节,而不管指针值和内存对齐等因素。

        【讨论】:

          【解决方案5】:

          指针运算以sizoeof(*pointer) 倍数完成 - 也就是说,对于指向 int 的指针,增量将前进到下一个整数(或 32 位整数为 4 个字节)。

          【讨论】:

          • “32 位整数的 4 个字节”,好吧,这并不总是正确的。最好说“32 位整数中的(32 / CHAR_BIT)字节”(当然使用 C++ 字节的定义)。但话说回来,谁说整数是 32 位的?
          • 几乎没有任何体系结构的字节大小不同于 8 位。 int 类型不一定是 32 位,但“32 位整数”是。我没有看到你指出...
          • 许多微控制器和 DSP 的配置很奇怪(有一个 TI 芯片,所有类型都是 16 位)。
          • @Skizz,我没有说它们不是字节大小不同于 8 的架构——我说几乎没有。如果您查看大多数(也许是全部)(现代)CPU 和 MCU,您会看到 8 位字节。 DSP 确实是奇怪的生物。有些是每字节 24 或 32 位。
          猜你喜欢
          • 1970-01-01
          • 2010-09-23
          • 2017-01-05
          • 2013-05-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-04
          • 1970-01-01
          相关资源
          最近更新 更多