鱼C论坛

 找回密码
 立即注册
查看: 1965|回复: 5

利用指针强制数据类型转换

[复制链接]
发表于 2016-10-7 21:23:13 | 显示全部楼层 |阅读模式
5鱼币

#include <iostream>
using namespace std;
#define SIZE sizeof(char) + sizeof(short) + sizeof(int) + sizeof(double)

void main()
{
        char a1, a2;
        short b1, b2;
        int c1, c2;
        double d1, d2;
        char array[SIZE];
        a1='a';
        b1=1;
        c1=230;
        d1=0.9;
        array[0] = a1;
        *(short*)(array + 1) = b1;
        *(int*)(array + 3) = c1;
        *(double*)(array + 7) = d1;
        a2 = array[0];
        b2 = *(short*)(array + 1);
        c2 = *(int*)(array + 3);
        d2 = *(double*)(array + 7);
        std::cout << a2 << " " << b2 << " " << c2 << " " << d2 << std::endl;
        system("pause");
}
复制代码



<
        *(short*)(array + 1) = b1;
        *(int*)(array + 3) = c1;
        *(double*)(array + 7) = d1;
        a2 = array[0];
        b2 = *(short*)(array + 1);
        c2 = *(int*)(array + 3);
        d2 = *(double*)(array + 7);
>这一段指针的运用实在看不懂。请大神们指点指点小弟。。

最佳答案

查看完整内容

这个数组array类型是char型的,且长度是四种类型长度的和。按理说只能存放char型数据,所以array[0] = a1是没问题的,占用一个字节。 当要存放short类型数据时,必须就行强制转换。*(short*)(array + 1) = b1中(array + 1)指针指向第二个字符空间,(short*)(array + 1)强制转换成指向short类型数据的指针, *(short*)(array + 1)对指针进行解指针操作,将short类型数据b1赋值给 *(short*)(array + 1)。 接下来,*(int*)(array + ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-7 21:23:14 | 显示全部楼层
这个数组array类型是char型的,且长度是四种类型长度的和。按理说只能存放char型数据,所以array[0] = a1是没问题的,占用一个字节。
当要存放short类型数据时,必须就行强制转换。*(short*)(array + 1) = b1中(array + 1)指针指向第二个字符空间,(short*)(array + 1)强制转换成指向short类型数据的指针, *(short*)(array + 1)对指针进行解指针操作,将short类型数据b1赋值给 *(short*)(array + 1)。
接下来,*(int*)(array + 3) = c1之所以加3是因为b1的short类型占两个字节,加上a1的char类型占一个字节,共3个字节,所以加3指向第四个地址。依次类推,原理同上,将int型数据赋值给*(int*)(array + 3)
后面四行不用说也该懂了,就是讲数组中的数据又赋值给相应的变量。相当于a2=a1,b2=b1,c2=c1,d2=d1

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
Evin_Kim + 5 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-8 20:02:20 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-10-8 21:41:21 | 显示全部楼层
~逆天~ 发表于 2016-10-8 08:49
这个数组array类型是char型的,且长度是四种类型长度的和。按理说只能存放char型数据,所以array[0] = a1是 ...

感谢大神的帮忙!
我还有个问题:
"(short*)(array + 1)强制转换成指向short类型数据的指针, *(short*)(array + 1)对指针进行解指针操作"
是说先将指针类型转换成与原数据一致的类型之后,解指针操作将原数据逐位写到数组中去吗?我主要想知道解指针操作就能按照char类型的方式写入数组的实现原理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-12 17:36:15 | 显示全部楼层
乱写
指针转换有特定限制
不能这样随便切来切去
这段代码 涉及未定义行为
结果没有意义

这里主要是一个内存对齐的问题
比如一个 int* 指针 要求从4的倍数的地址开始读取数据
比如一个 double* 指针 要求从8的倍数的地址开始读取数据
像你这样乱读 在连续剧里面 只能活2集
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-12 17:37:36 | 显示全部楼层
~逆天~ 发表于 2016-10-7 21:23
这个数组array类型是char型的,且长度是四种类型长度的和。按理说只能存放char型数据,所以array[0] = a1是 ...

你解释了很多
但其实不对
指针转换没这么简单
这里没处理好内存对齐
是未定义行为了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 13:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表