C语言二级指针问题: int x=0x100100; char *p=(char *)&x; *p c语言问题?

作者&投稿:花虾 (若有异议请与网页底部的电邮联系)
x的初值是0x100100也就是一个16进制数,指针p指向A的首地址,根据16进制数,此时p指向的是开头的0x10,然后通过指针赋值,此时的x是0x410100。同理指针移位2位,指向末端的0x00。赋值过后,x == 0x410132,把x拆分成3个字节,0x41 0x01 0x32。 由于我们目前用的计算机大部分是小端对齐。高低位存储的机制(具体一时间我忘记怎么解释,可以自己百度大小端对齐看看),所以实际在内存中是这样的0x320141(也就是按字节反过来),用%x输出16进制数,所得为问题所示结果。

C语言二级指针奇葩问题~

很正确啊,看下面两句就应该清楚了吧?注意p是二级指针,并不直接指向{W...}
str[2]= p[1] + 3;//这时p[0]指向str[2],p[1]指向str[3],即最终内容是Nanjing;p[1] + 3最终内容就是jing;你把str[2]通过执行p[1] + 3指向了jing,而p[0]是指向str[2]的;由于*p就是p[0],printf("*p=%s
",*p);就是printf("*p=%s
",p[0]);,也就是printf("*p=%s
",str[2]);,不输出jing还能输出什么呢?所以一点也不奇葩!

判断条件 (delta=0) 是个赋值语句而不是判断语句。
因此会先给delta赋值为0,之后判断delta是否为0,如果不为0则输出x1=x2,如果为0则输出x1!=x2。由于delta已经被错误地赋值为0了,所以最后输出的就是 x1!=x2。