Evin_Kim 发表于 2016-10-7 21:23:13

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


#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;
      a1='a';
      b1=1;
      c1=230;
      d1=0.9;
      array = a1;
      *(short*)(array + 1) = b1;
      *(int*)(array + 3) = c1;
      *(double*)(array + 7) = d1;
      a2 = array;
      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;
      b2 = *(short*)(array + 1);
      c2 = *(int*)(array + 3);
      d2 = *(double*)(array + 7);
>这一段指针的运用实在看不懂。请大神们指点指点小弟。。

~逆天~ 发表于 2016-10-7 21:23:14

这个数组array类型是char型的,且长度是四种类型长度的和。按理说只能存放char型数据,所以array = 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

薇薇 发表于 2016-10-8 20:02:20

Evin_Kim 发表于 2016-10-8 21:41:21

~逆天~ 发表于 2016-10-8 08:49
这个数组array类型是char型的,且长度是四种类型长度的和。按理说只能存放char型数据,所以array = a1是 ...

感谢大神的帮忙!
我还有个问题:
"(short*)(array + 1)强制转换成指向short类型数据的指针, *(short*)(array + 1)对指针进行解指针操作"
是说先将指针类型转换成与原数据一致的类型之后,解指针操作将原数据逐位写到数组中去吗?我主要想知道解指针操作就能按照char类型的方式写入数组的实现原理。{:7_126:}

求道于盲 发表于 2016-10-12 17:36:15

乱写
指针转换有特定限制
不能这样随便切来切去
这段代码 涉及未定义行为
结果没有意义

这里主要是一个内存对齐的问题
比如一个 int* 指针 要求从4的倍数的地址开始读取数据
比如一个 double* 指针 要求从8的倍数的地址开始读取数据
像你这样乱读 在连续剧里面 只能活2集

求道于盲 发表于 2016-10-12 17:37:36

~逆天~ 发表于 2016-10-7 21:23
这个数组array类型是char型的,且长度是四种类型长度的和。按理说只能存放char型数据,所以array = a1是 ...

你解释了很多
但其实不对
指针转换没这么简单
这里没处理好内存对齐
是未定义行为了
页: [1]
查看完整版本: 利用指针强制数据类型转换