利用指针强制数据类型转换
#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);
>这一段指针的运用实在看不懂。请大神们指点指点小弟。。 这个数组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 08:49
这个数组array类型是char型的,且长度是四种类型长度的和。按理说只能存放char型数据,所以array = a1是 ...
感谢大神的帮忙!
我还有个问题:
"(short*)(array + 1)强制转换成指向short类型数据的指针, *(short*)(array + 1)对指针进行解指针操作"
是说先将指针类型转换成与原数据一致的类型之后,解指针操作将原数据逐位写到数组中去吗?我主要想知道解指针操作就能按照char类型的方式写入数组的实现原理。{:7_126:} 乱写
指针转换有特定限制
不能这样随便切来切去
这段代码 涉及未定义行为
结果没有意义
这里主要是一个内存对齐的问题
比如一个 int* 指针 要求从4的倍数的地址开始读取数据
比如一个 double* 指针 要求从8的倍数的地址开始读取数据
像你这样乱读 在连续剧里面 只能活2集 ~逆天~ 发表于 2016-10-7 21:23
这个数组array类型是char型的,且长度是四种类型长度的和。按理说只能存放char型数据,所以array = a1是 ...
你解释了很多
但其实不对
指针转换没这么简单
这里没处理好内存对齐
是未定义行为了
页:
[1]