标签:
今天有一位同学问了我一道c语言的题目,表示被虐了,问了通神才明白。。。。(通神就是牛!!!)
题目如下:
给出下面程序的运行结果:
#include<stdio.h> void main() { int x=0x100100; char *p=(char*)&x; *p=‘A‘; p=p+2; *p=50; printf("%x\n",x); }
运行结果是 320141
这是为什么呢?
大家都知道,int 类型的变量在内存中占 4 个字节(一个字节有8位,所以 x 在内存中是以二进制存储的,即:0000 0000 0001 0000 0000 0001 0000 0000
而char 类型变量在内存中只占 1 个字节,所以第二条语句运行后,p 指向 x 的最后一个字节,即:0000 0000,然后将这个字节赋值为‘A‘,即十进制中的 65 (‘A‘的ASCII码值为65),十六进制中的 0x41,此时 x 变为0x100141。
然后p指向 x 的第三个字节,即:0001 0000 ,将这个字节赋值为50,即十六进制中的 0x32, x就变为0x320141。
这道题活用了十六进制的保存方式(其实只是我不会。。。),然后需要注意的是指针取字节的时候是从低位取起的,二进制下,右边为低位,左边为高位。
在这里添一道题,同样求运行结果,大家看看有没有懂了:
#include<stdio.h> void main() { char*p="abcefghijklmnopqrstuvwxyz"; int *x=(int *)p; x++; printf("%c\n",*(p+2)); printf("%s\n",p+2); printf("%x\n",*(x+2)); }
结果如下:
标签:
原文地址:http://www.cnblogs.com/yaoyueduzhen/p/4348469.html