各位看官可以将这段程序看成三个c语言题目,注释相当于就是解题过程了,可以自行运行下面源代码。
#include<stdio.h>
int main()
{
int a=0x11223344;//十六进制数赋值,共8个数,每个数4位,正好32位,四个字节,一个int的大小。
char* p1=(char*)&a;//将a的地址从int* 强制类型转化成 char*,然后保存在p1中。
*p1=0;//给*p1赋值
/*
十六进制数打印,结果应该为11223300,因为char类型的指针一次只能访问一个字节,也就是两位。又因为整型数据存放的时候每个字节是倒着存放的
也就是a在内存中是 44 33 22 11 这样存放的(十六进制数两个数为一个字节)
所以p1拿到的是44的地址,所以*p1会将a改成 00 33 22 11(内存中)
也就是a=11223300(十六进制)
*/
printf("%x\n",a);
int b=0x11223344;
short* p2=(short*)&b;
*p2=0;
/*
与上面同理,b在内存中是 44 33 22 11,由于p2是short*类型的,所以一次可以取2个字节
所以p2拿到的是44 33 的地址,*p2=0;后b改为 00 00 22 11(内存中);也就是b=11220000(十六进制)
*/
printf("%x\n",b);
int c=0x11223344;
char* p3=(char*)&c;
*p3=16;
*(p3+1)=32;
/*
p1一样,*p3拿到的是44的地址,将这个地址上面的值改成十进制的16,也就是十六进制的10
*(p3+1)拿到的是33的地址,将这个地址上面的值改成十进制的32,也就是十六进制的20
所以最终将十六进制:44 33 22 11 改成了 十六进制:10 20 33 11
也就是c=11222010
*/
printf("%x\n",c);
return 0;
}
|