为什么这个指针减法输出这个?

时间:2016-02-12 02:21:36

标签: c pointers subtraction

这是在C.我正在学习C,这是来自课堂幻灯片的一个例子。

int main(int argc, char *argv[]) {
    int a = 5, b = 10, c;
    int *p = &a, *q = &b;
    c = p - q;
    printf("%d", c);
    return 0;
}

我运行时的输出是3,我不明白为什么。似乎因为它正在使用&它会减去内存地址,输出的内存地址为-5。

2 个答案:

答案 0 :(得分:5)

你正在减去指针的地址而不是它们所指向的地址,你将得到两个存储器地址之间的差异,这不能保证是任何特定的。如果您在其他计算机或编译器上运行它,则很可能是完全不同的值,因为bp可以分配各种地址。例如,在我的机器上它是1.这样的现象被称为未定义的行为,原因是你不能保证所有编译器和机器都有相同的结果。

如果您取消引用qc = *p - *q;这样的c,那么您将获得-5作为p作为两个集合值之间的差异。此外,如果您将qint *p = a, *q = b;指定为c,那么您也会将py.test mod1.py 设为-5,因为这样您就可以将指针设置为不同的地址,然后尝试访问做这样的事情在所有情况下都是一个糟糕的主意。

答案 1 :(得分:3)

减去不同数组的2个指针是未定义的行为。

  

当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素的元素;结果是两个数组元素的下标的差异。 C11§6.5.69

相反,要获取某些数字差异,请将值转换为intptr_t

int main(int argc, char *argv[]) {
  int a = 5, b = 10, c;
  int *p = &a, *q = &b;
  intptr_t ip = (intptr_t) p;
  intptr_t iq = (intptr_t) q;
  intptr_t diff = ip -iq;
  printf("%lld", (long long) diff);
  return 0;
}

当然,您打印的值可能不是5. int的位置因编译而异。