关于 char * 的问题我在下面的两篇博文中均有提及,如果本文看了不够爽的,可尽情翻阅我的这两篇,相信您的感受定会如我一般。
真TM神奇
1、strlen和sizeof的分析比较
2、字符数组和字符指针
声明:short 在我的机器中是2个字节。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
short p = 1;
printf("%d\n", p);
printf("%p\n", &p);
((char *)&p)[0] = 0;
printf("%d\n", p);
printf("%p\n", &p);
((char *)&p)[1] = 2;
printf("%d\n", p);
printf("%p\n", &p);
((char *)&p)[2] = 3;
printf("%d\n", p);
printf("%p\n", &p);
((char *)&p)[3] = 4;
printf("%d\n", p);
printf("%p\n", &p);
return 0;
}
然后接着往下走
是时候理解一波代码的具体意思了,
((char *)&p)[0] = 0;
先取short类型的p(内存中两个字节)的低地址,0xff0e 0xff0f。然后强制转换为 (char *) 即字符指针(内存中四个字节),所以此时p的内存地址为 0xff0e 0xff0f 0xff10 0xff11
紧接着((char *)&p)[0] = 0; 取地址偏移量为[0]的位置并把它赋值为0。我们打开内存镜像看一下是不是这样。
必须的!!!
然后,同上面的分析一样,我们看接下来的[1] [2] [3]如何。。。
完美吻合有没有,,哈哈哈哈哈。。。
但是结果为什么是512呢,
我们知道虽然强制转换为(char *)但是本质还是 short
言外之意占的还是两个字节,这样就会自己舍去高字节。留下低位两个字节的数据。也就是 0000 0010 0000 0000 就是2的九次方。。512…
第一步:short p = 1;
p变为
00000000 00000001
第二步:((char*)&p)[0] = 0;
((char*)&p)[0]对应的位置
↓
00000000 00000001
所以p变为
00000000 00000000
第③步:((char*)&p)[1] = 2;
((char*)&p)[0]对应的位置
↓
00000000 00000001
所以p变为
00000010 00000000(这个值就是512了,即2^10)
第④步:((char*)&p)[2] = 3;
((char*)&p)[0]对应的位置
已经超出范围
所以并不会改变p的值
第⑤步:((char*)&p)[3] = 4;
和上面一样
还能学到一个新东西,就是数组的[]比如,char *p, 那么p[0],就相当于&p
本文通过实例详细解析了C语言中short类型变量通过类型转换为char*后的内存操作过程,包括strlen与sizeof的区别、字符数组与字符指针的概念,并深入探讨了内存地址与数据存储的关系。
1238





