带指针的C问题

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

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

但回答是这样的

 1000 2000 -250 

我无法理解pq会发生什么,为什么答案为-250

正确但可能无用的答案: 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); } 

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

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

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

在这个程序中有如此多的未定义行为,打印的值实际上非常无关紧要。

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

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

考虑pq是否为char *变量,然后pq将输出为-1000

在你的情况下, pqint * variable,如果int大小是4个字节,那么pq将给你输出250 。 在编译器上执行此操作,其中int大小为2个字节,您将得到-500的结果。