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

今天在写到代码的时候,因为要将数据写入到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  
上面的打印是正确的,因为进行了数据类型的强制转换,5就代表了存入gStr1数组10个字节了,同理,gStr1也是一个道理
  • 9
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值