C语言数组、指针强制类型转换

今天在写到代码的时候,因为要将数据写入到flash中去,这块flash规定每次写入两个字节,然后发现了一个挺好玩的事情,那就是类型强制转换。
通过测试发现char类型强制转换成short或者int类型时候,会由原本占据1Byte的数据,变成了占据2Byte的数据或者4Byte的数据。同样,指针类型的也一样,char*类型的指针,通过强制转换成了short*或者int*类型的指针,也会由原来指向1Byte空间的数据,变成了指向2Byte空间的数据或者4Byte空间的数据

下面就是我在vs上做的小测试

测试代码

#include
#include
//全局变量数组
short gStr1[15];  //每个数据占据2字节
int   gStr2[15];  //每个数据占据4字节

//将字符串存到全局变量数组中
void ReadStr1(short *buf,int size)
{
    int i;
    for(i=0;i

编译调试,打印情况如下(由于不会贴图,将就看看吧,哈哈):

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  

上面的打印是正确的,因为进行了数据类型的强制转换,5就代表了存入gStr1数组10个字节了,同理,gStr1也是一个道理

你可能感兴趣的:(C和指针)