c ++指向整数的指针,在减去时给出不同的答案

时间:2018-02-06 17:59:12

标签: c++ pointers casting reference

#include <iostream>
using namespace std;

int main() {

   int* a = (int*)50;//printf("%d",a)-gives 50
   int* b = (int*)2;//printf("%d",b)-gives 2

  printf("%d",a-b);//12 is answer, but shouldnt it be 50-2=48
  return 0;
}

我想知道为什么答案是12,因为它可以是50-2 = 48,或5-2 = 3.

3 个答案:

答案 0 :(得分:4)

指针算法在知道底层类型的情况下运行。向指针添加值时,可以添加基础类型的元素数,而不是 bytes 的数量。类似地,对于两个指针的减法,差异在于元素的数量,而不是字节数。

您的指针属于int *类型。根据您的输出,似乎int的长度为4个字节。因此,这个类型的两个指针的值相差48实际上在48/4 = 12 int s中有所不同。这就是减法的结果。

顺便说一句,为指针指定一个特定的数值会调用undefined behavior,就像减去两个不指向同一个数组对象的指针一样。您可以通过创建数组并为ab分配其中两个元素的地址,以一致的方式执行此操作:

int array[60];
int *a = &array[2];
int *b = &array[50];

答案 1 :(得分:0)

首先,您正在错误地初始化指针,这导致undefined behavior。未定义行为的行为是未指定的,因此从理论上讲,任何事情都可能发生,例如值12的打印,这可能是指针内存的差异。使用以下new operator来正确初始化指针:

int* a = new int{50};
int* b = new int{2};

接下来,要打印这些值的差异,您必须取消引用指针以获取其指向值:

printf("%d",*a-*b);

答案 2 :(得分:0)

给定指向T类型对象的指针,指针与其+1之间的数字差异为sizeof(T)

T* p1 = <some pointer value>;
T* p2 = p1 + 1;

鉴于上述情况,

(p2 - p1)1

但是,如果您获取指针的数值,如果p1a1,,则p2将为a1 + sizeof(T)

假设您指向intsizeof(int)为4。

 a1                  a2
 |                   |
 v                   v
 +----+----+----+----+----+----+----+----+
 |    |    |    |    |    |    |    |    |
 +----+----+----+----+----+----+----+----+

p1的值是地址a1p1+1指向a1之后的下一个整数,这意味着它将是a2。如您所见,a1a2之间的数字差异不是1而是sizeof(int)