今天在写到代码的时候,因为要将数据写入到flash中去,这块flash规定每次写入两个字节,然后发现了一个挺好玩的事情,那就是类型强制转换。
通过测试发现char类型强制转换成short或者int类型时候,会由原本占据1Byte的数据,变成了占据2Byte的数据或者4Byte的数据。同样,指针类型的也一样,char*类型的指针,通过强制转换成了short*或者int*类型的指针,也会由原来指向1Byte空间的数据,变成了指向2Byte空间的数据或者4Byte空间的数据
下面就是我在vs上做的小测试
测试代码
#include<stdio.h>
#include<stdlib.h>
//全局变量数组
short gStr1[15]; //每个数据占据2字节
int gStr2[15]; //每个数据占据4字节
//将字符串存到全局变量数组中
void ReadStr1(short *buf,int size)
{
int i;
for(i=0;i<size;i++)
gStr1[i]=buf[i];
printf("gStr1=%s\n",gStr1); //打印数组
printf("gStr1[0]=%c\n",gStr1[0]); //数组中第一个数据
printf("gStr1[1]=%c\n",gStr1[1]); //数组中第二个数据
printf("gStr1=%s\n",gStr1+1); //打印数组首地址+1后的数据
}
void ReadStr2(int *buf,int size)
{
int i;
for(i=0;i<size;i++)
gStr2[i]=buf[i];
printf("gStr2=%s\n",gStr2);
printf("gStr2[0]=%c\n",gStr2[0]);
printf("gStr2[1]=%c\n",gStr2[1]);
printf("gStr2=%s\n",gStr2+1);
}
int main()
{
char s1[]={"ABCDEFHIJK"};
char s2[]={"abcdefhijk"};
printf("gStr1数组的情况分析:\n");
ReadStr1((short*)s1,5);
printf("\n");
printf("gStr2数组的情况分析:\n");
ReadStr2((int*)s2,3);
system("pause");//在vs下测试,防止终端显示闪退
return 0;
}
编译调试,打印情况如下(由于不会贴图,将就看看吧,哈哈):
gStr1数组的情况分析:
gStr1=ABCDEFHIJK
gStr1[0]=A
gStr1[1]=C
gStr1=CDEFHIJK
gStr2数组的情况分析:
gStr2=abcdefhijk
gStr2[0]=a
gStr2[1]=e
gStr2=efhijk
请按任意键继续. . .
结论分析:
分析gStr1:
gStr1[0]=A
数组的第一个数据为A
gStr1[1]=C
数据的第二个数据为C,说明gStr1[0]里面存放了两个字节,A和B;
验证了char指针类型强制转换成short指针类型,将变成指向的地址可以存放2Byte
大小的数据
gStr1=CDEFHIJK
由这个结果我们可以知道,gStr1+1是指向了gStr1+sizeof(gStr1)地址中的数据,这里的sizeof(gStr1)=2,
而不是1,因为进行了类型强制转换,又char转到了short
分析gStr2:
经过上面的分析,gStr2的情况是一样的,只是short是占用2Byte,而int是占用4Byte,就着点区别而已,
这里就不重复叙述了
注意
可能有些人会对ReadStr1((short)s1,5);这里的5感到疑惑,如果你是想这里传入5,那gStr1数据不应该
只能存入5个字节的数据吗???
printf("gStr1=%s\n",gStr1); //打印数组
这里打印应该是这样才对啊
gStr1=ABCDE
而不是上面打印的那样啊
gStr1=ABCDEFHIJK