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

来源:互联网 发布:excel找重复数据 编辑:程序博客网 时间:2024/05/16 05:42

今天在写到代码的时候,因为要将数据写入到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=ABCDEFHIJKgStr1[0]=AgStr1[1]=CgStr1=CDEFHIJKgStr2数组的情况分析:gStr2=abcdefhijkgStr2[0]=agStr2[1]=egStr2=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也是一个道理

0 0