一、类型强制转换 其实类型强制转换并没有修改原来存储的值,也没有对内存做任何的修改,只不过说在取值的时候读取数据的长度不同,进而产生了不同的结果。首先引入一个网上看到的程序:
运行结果为: ![]() 通过上面的结果可以得到以下初步结论: 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(上面的结论三知道,数据是小端存储的)。 二、指针强制转换为指向指针的指针 看看下面的这段代码:
其运行的结果为: ![]() |
|