【问题标题】:Addition of uint32* with uint32将 uint32* 与 uint32 相加
【发布时间】:2014-03-19 21:40:06
【问题描述】:

我无法理解指针运算。任何帮助将不胜感激。

uint32* valA = 0x80000000; 
uint32 valB = 0x7a0

valA += valB;

valA 的值为 0x80001e80。这是 valB 的四倍。

我的疑惑: 1.为什么valA的值没有变成0x800007a0。 2. 如何使 valA 仅增加 0x7a0 而不是 valB 值的四倍。

【问题讨论】:

    标签: c


    【解决方案1】:

    C 中的指针运算按类型的大小进行缩放,这使得这两个等价:

    valA = valA + valB;
    valA = &valA[valB];
    

    如果你想强制它把它当作一个字节偏移量,你需要先转换为char *

    valA = (uint32 *)((char *)valA + valB);
    

    【讨论】:

    • @delnan:确实。每当您看到强制转换,尤其是涉及指针类型时,都应该始终保持怀疑;)。
    【解决方案2】:

    指针算法是指针指向的数据大小的问题。

    uint32 有 4 个字节大,这是因为结果是 valB 的四倍。

    问题是,为什么你想让你的指针只增加 0x7a0。在这种情况下这没有意义。它仅在您需要访问字节时才有用。如果你只需要那个,你可以使用指向一个字节的指针。

    【讨论】:

      【解决方案3】:

      向指针添加一个 int 会使指针前进指针所指向的数据类型的实例数。也就是说,如果您系统的sizeof(uint) 是 4 个字节,则整数在添加到指针地址之前要乘以 4。

      本质上,指针数学与数组寻址是同构的。如果p 是一个指针,i 是一个整数,p[i]*(p+i) 相同……在旧的C 编译器中,您甚至可以将其写为i[p] 并得到相同的结果。

      【讨论】:

        【解决方案4】:

        uint32 占用 4 个字节的空间。 &valA 之后的下一个 uint32 出现在 &((valA + 4U))

        【讨论】:

          【解决方案5】:

          C 和 C++ 指针运算必须将指针的值增加类型对象的大小。

          假设你有:

          int a[2];
          int* b = a;
          

          此时b指向a的第一个元素。现在,增加b

          ++b;
          

          您会期望b 指向a 的第二个元素。 a 的第一个元素和a 的第二个元素的地址不同int 的大小。因此,如果++b 必须将b 的值增加int 的大小,而不仅仅是一个字节。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-12-18
            • 2016-02-15
            • 1970-01-01
            • 2012-09-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-10-15
            相关资源
            最近更新 更多