我有一个程序问题,这里是代码。C指针问题
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
?
我有一个程序问题,这里是代码。C指针问题
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
?
正确但可能无用的答案:p - q
等于(1000 - 2000)/(sizeof int)
。对于大多数C编译,sizeof int
是4.
潜在更有用的答案:像(int*) 1000
这样的类型转换的影响是未定义的。该代码创建一个指向地址为1000的int 的指针。该地址可能无效。要创建一个指向与价值1000一个整数,这样写:
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-31 16:33:53
-1:是的,但完全没有帮助。 – 2012-07-31 16:37:40
它是怎么7人upvoted -1评论,但答案仍然有+1? – Celeritas 2013-08-02 06:11:18
当你减去两个指针,只要它们指向同一数组,结果是元素的分隔它们的数量。
在您的平台上,int是4个字节。在地址2000和地址1000之间有-250个元素。
由于p和q不都指向同一个数组,所以结果是未定义的。你可以得到任何结果,包括你期望的结果。
p
是一个指针变量,它只能存储一个int
变量的地址。但是您将1000
存储为无效的地址。然后您将2000
存储到变量q
。
现在你正在做指针算术p-q
。总是指针算术会根据地址类型的大小给出输出。这将像(p - q)/sizeof(type)
一样工作。
考虑一下,如果p
和q
是char *
变量,然后p-q
意志给你输出-1000
在你的情况p
和q
是int *
变量,然后p-q
意志给你输出250
如果int
大小4字节。在编译器上执行此操作,其中int
的大小为2个字节,则会得到一个结果为-500
。
请注意,使用'%d'格式说明符打印指针会调用未定义的行为。你可以使用'%p'格式说明符printf(“%p”,(void *)p);'打印'void *',或者你可以在打印之前将指针转换为整型,'printf(“ %“PRIdPTR”“,(intptr_t)p);'。对于指针差别,'printf(“%td”,(p-q));'。 – 2012-07-31 20:26:48