带指针的C问题

时间:2012-07-31 16:18:10

标签: c pointers

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

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 个答案:

答案 0 :(得分: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); 
}

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:0)

在这个程序中有太多未定义的行为,打印的值实际上非常重要。

答案 3 :(得分:0)

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

现在你正在做指针算术p-q。始终指针算术将根据地址类型的大小给出输出。这将像(p - q)/sizeof(type)一样工作。

考虑pqchar *变量,然后p-q会将输出显示为-1000

在您的情况下pqint *变量,如果p-q的大小,则250将为您提供int的输出是4个字节。在编译器上执行此操作,其中int的大小为2个字节,您将得到-500的结果。