【问题标题】:Difference of two addresses in C [duplicate]C中两个地址的差异[重复]
【发布时间】:2012-01-04 16:54:54
【问题描述】:

可能重复:
Pointer Arithmetic

给定的代码

int arr[12];
int * cur = arr;
cur++;
cout<<"cur-arr = "<<cur-arr<<endl;

输出1,但我期待sizeof(int)。有人可以解释一下这种行为的性质吗?

【问题讨论】:

  • 您对此有什么不明白的地方?你期待什么?
  • 我认为他期望sizeof (int) 输出
  • 请解释混乱紧急情况的性质。
  • 到目前为止,我看到的所有问题似乎都是“困惑的,请解释一下”,但这是一个问答网站,而不是论坛。所以,问问题。 “因为 Z,我期待 X,但我得到了 Y。为什么我没有得到 X?”

标签: c++ c


【解决方案1】:

这是 C 指针算法的定义行为。它以尖字的大小为单位。如果将最后一行的减法更改为

(char *)cur - (char *)arr 

你在输出中得到 4。

【讨论】:

  • 那就是char *。你不能在 void * 上做算术。
  • 一些编译器确实允许void * 算术。 char * 肯定更好。
【解决方案2】:

这是arrcur(在减法时为arr+1)之间的元素数(此处为ints)。编译器注意到cur 是一个指向整数的指针,arr 是一个整数数组。要获取总字节数,请尝试以下操作:

(cur - arr) * sizeof(arr[0]);

【讨论】:

    【解决方案3】:

    cur 是指向int 的指针,初始化为某个值(arr - 数组到指针转换的语义在这里无关紧要),递增(cur++)并与其旧值进行比较。不出所料,它通过增量操作增长了 1。

    具有给定类型的指针算术就像常规算术一样工作。虽然在此示例中指针前进了sizeof(int) 字节,但指针之间的差异也是以sizeof(int) 为单位计算的,因此您可以看到简单的算术。

    【讨论】:

    • 这不是完全递增,指针本身并没有增长一。它增长了sizeof(int),但指针减法运算符返回元素的差异,而不是字节。
    • @ulidtko:这并不重要。当你考虑到抽象时,它肯定是一个增量,即使基础价值增加了​​超过(int)1
    【解决方案4】:

    指针的加减法根据指针类型起作用。

    【讨论】:

      猜你喜欢
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 2014-01-18
      相关资源
      最近更新 更多