带指针的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)
。
考虑p
和q
是否为char *
变量,然后pq
将输出为-1000
在你的情况下, p
和q
是int *
variable,如果int
大小是4个字节,那么pq
将给你输出250
。 在编译器上执行此操作,其中int
大小为2个字节,您将得到-500
的结果。