分享

C语言中有关强制转换的相关问题

 风雪夜归人_95 2014-07-17
一、类型强制转换
其实类型强制转换并没有修改原来存储的值,也没有对内存做任何的修改,只不过说在取值的时候读取数据的长度不同,进而产生了不同的结果。首先引入一个网上看到的程序:
 int main()
{

    char uData[50];
    short cOut;
    int i;
    void *p;
    printf("%d\n",sizeof(void *));
    char cc[2]={4,5};
    cOut=*(short *)cc;
    printf("%d\n",cOut);
    for(i=0;i<50;i++)
    {
      uData[i]=i;
    }
    i = (int *)uData;
    int j = uData;
    printf("%d\n",j);
    printf("%d\n",i);
    i = (int *)uData+1;
    printf("%d\n",i);

    cOut=*(short *)((int *)uData+1);
    printf("%d\n",cOut);

    return 0;
}

运行结果为:
 
 
通过上面的结果可以得到以下初步结论:
1. (void *)的存储空间为4个字节
2. (int *)uData+1 等价于 uData+4
3. 小端存储。一个字符数组转换为一个short型的数据时,原字符数组中数组索引越大,该值在short型中所处的位越高。例: cc[0]='4'. cc[1]='5',cOut=*(short*)cc,则cOut=0x0504(十进制就是1284)。

针对上面的程序,实际上主要解释一句:
cOut=*(short *)((int *)uData+1);
uData是一个char型数组的首地址,扩展为一个指向int型数据的指针;指针加1的操作实际上是指针原来的值加上指针所对应类型的字节数(这里是int,int在这里需要4个字节)。所以,uData无论扩展与否,其值都是2686682(一个随机分配的起始地址,此时的*(int *)uData=0x00010203),指针加1操作后,变为2686686(此时的*((int *)uData+1)=0x0405060708)。此时该指针又进行了一次强制转换,变成一个指向short型数据的指针,最后将该指针的内容赋给cOut。所以
cOut=0x0504(上面的结论三知道,数据是小端存储的)。

二、指针强制转换为指向指针的指针
看看下面的这段代码:
 int main()
{

    int *p;
    int **q;
    int i = 1;
    p=&i;
    q = (int **)p;
    printf("%d\n",p);
    printf("%d\n",&p);
    printf("%d\n",*p);
    printf("%d\n",q);
    printf("%d\n",&q);
    printf("%d\n",*q);

    return 0;
}


其运行的结果为:
 
 
可见,指向指针的指针也不过是一个指针罢了,只不过指向指针的指针存储的值是一个普通变量的地址的地址;一个指针变量也就是一个变量罢了,只不过指针存储的是一个普通变量的地址。而将一个指针强制转化为一个指针的指针,也是可行的,但是其具体的意义有多大,不清楚。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多