此代码打印“世界”它是如何做的,任何人都可以解释?
#include<stdio.h>
int main()
{
char i =10;
char *pc = (char*)&i;
int *pi = (char*)&i;
pi++ && pc++;
if((void*)pi==(void*)pc)
printf("hello");
else
printf("world")
}
答案 0 :(得分:2)
引用章节§6.5.2.4, Postfix递增和递减运算符来自C11
标准,(强调我的)
后缀
++
运算符的结果是操作数的值。作为副作用, 操作数对象的值递增(即,适当类型的值为1 添加到它)。 [...]
现在,在你的情况下,
pc
和pi
指向同一地址。pc
是指向char
类型的指针,而pi
是指向int
类型的指针。接下来,
pc++
后,pc
将按类型char
的大小递增。因此,pc
指向与(char *)pc + sizeof(char)
pi++
后,pi
将按类型int
的大小递增。因此,pi
指向与(char *)pi + sizeof(int)
相同的内存位置。现在,sizeof(char)
为1并且考虑sizeof(int)
是4/8(32/64位平台),您可以理解,pc
和{{1}持有的最终指针将会有所不同。
因此,pi
评估为假。
答案 1 :(得分:0)
使用指针算法,考虑指针移动经过多少字节以获得它指向的1个完整对象是很有用的。
int
指针指向int
个对象。将int
指针移过1 int
对象需要将指针移动到该int
对象中的所有字节(在64位计算机上为8字节)。
类似地,将指针移动到超过1个此类对象的更大对象将涉及将指针移动到 对象中的所有字节。
因此,如果您考虑将指针递增(或递减)为将指针移动到对象(或对象)之前(或之前),则很明显指针值(地址)必须按字节数更改在那个对象中。
在您的示例中,两个指针最初都指向内存中的相同地址。递增int
指针会将其移动int
的大小,递增char
指针会将其移动char
的大小。它们的价值最终会有所不同,因为每个价值都会因不同的价值而变化。