带指针的C问题

rɑː*_*dʒɑ 0 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;
}
Run Code Online (Sandbox Code Playgroud)

但回答是这样的

1000 
2000 
-250
Run Code Online (Sandbox Code Playgroud)

我无法理解发生了什么p-q以及为什么答案来了-250

kev*_*ine 12

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

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

int i = 1000;
int *p = &i;
Run Code Online (Sandbox Code Playgroud)

现在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); 
}
Run Code Online (Sandbox Code Playgroud)


Rol*_*ien 6

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

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

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