0

我有一个程序问题,这是代码。

int main()
{
int *p,*q;
p=(int*)1000;
printf("%d ",p);
q=(int*)2000;
printf("%d",q);
printf("%d",(p-q));
return 0;
}

但答案来了

1000 
2000 
-250

我无法理解发生了什么p-q以及为什么答案是这样的-250

4

4 回答 4

12

正确但可能无用的答案:p - q等于(1000 - 2000) / (sizeof int). 对于大多数 C 编译,sizeof int是 4。

可能更有用的答案:类型转换的效果(int*) 1000是未定义的。该代码在地址 1000 处创建一个指向 int 的指针。该地址可能无效。要创建指向值为 1000 的 int 的指针,请编写以下代码:

int i = 1000;
int *p = &i;

现在p指向i, 而*p, 指向的值p是 1000。

这是一些正确的代码,可以说明您的意思:

int main() {
  int i = 1000;
  int j = 2000;

  int *p = &i;
  int *q = &j;

  printf("i = %d *p = %d\n", i, *p);
  printf("j = %d *q = %d\n", j, *q);
  printf("*p - *q = %d\n", *p - *q); 
}
于 2012-07-31T16:33:12.100 回答
6

当两个指针相减时,只要它们指向同一个数组,结果就是分隔它们的元素个数。

在您的平台上,一个 int 是 4 个字节。地址 2000 和地址 1000 之间有 -250 个元素。

由于 p 和 q 不都指向同一个数组,因此结果是未定义的。您可以获得任何结果,包括您期望的结果。

于 2012-07-31T16:37:14.160 回答
0

这个程序中有这么多未定义的行为,打印的值真的很无关紧要。

于 2012-07-31T16:20:59.047 回答
0

p是一个指针变量,它只能存储int变量的地址。但是您存储1000为地址,这是无效的。然后你将存储2000到变量q中。

现在你正在做指针算术p-q。Always pointer arithmatic 将根据地址类型的大小给出输出。哪个会像(p - q)/sizeof(type).

考虑如果pqchar *可变的,那么p-q会给你输出为-1000

在您的情况下p,并且qint *可变的,那么p-q将为您提供输出,就250好像大小int为 4 字节一样。在大小为 2 字节的编译器上执行此操作int,您将得到-500.

于 2012-08-01T02:07:11.697 回答