当前位置: 首页> 文旅> 文化 > 西安专用网站建设_小程序制作流程收费_互联网金融营销案例_小红书推广

西安专用网站建设_小程序制作流程收费_互联网金融营销案例_小红书推广

时间:2025/8/30 4:21:45来源:https://blog.csdn.net/lixiaorong222/article/details/145707716 浏览次数:0次
西安专用网站建设_小程序制作流程收费_互联网金融营销案例_小红书推广

目录

52.1 类型双关 

52.2 union


52.1 类型双关 

 将一个int类型转为double类型,有如下方式

int main() {int a = 5;double b = a;//隐式类型转换double c = (double)a;//显示类型转换double d = *(double*)&a;//类型双关:将类型int的内存操作为double//打印a 5 b:5 c:5 d:-9.25596e+61std::cout << "a " << a << " b:" << b << " c:" << c << " d:" << d << std::endl;std::cin.get();
}

可以看到,类型双关的操作先把一个int类型指针转为double类型指针,然后解引用。结果是在原来的int内存之后继续了4个字节,然后获取整个内存,结果打印的地址并不理想,有可能造成崩溃,这样的类型双关操作不安全。下面演示安全的类型双关操作:

#include <iostream>
#include <thread>
#include <mutex>
#include <vector>struct Entity
{int x, y;int* getStartPosition(){return &x;}
};int main() {Entity e = { 1,2 };//方式一int* position = (int*)&e;//结构体转为数组std::cout << position [0]<< ","<<position[1] << std::endl;//打印1,2//方式二int* position2 = e.getStartPosition();std::cout << position2[0] << "," << position2[1] << std::endl;//打印1,2int y = *(int*)((char*)&e + 4);//通常使用y = e.y;来访问std::cout << y << std::endl;//打印2std::cin.get();return 0;
}

可以看到我们能够自如的操作c++的内存,同一块内存进行不同类型之间的转换,这就是类型双关。需要做的就是将原来的指针转换为另一个类型的指针(结构体e的指针转化为数组的起始指针),然后作为另一种类型去访问它(作为数组类型去访问)。

52.2 union

union关键字使得不同类型成员变量共享同一块内存,这运用了类型双关的概念

//
//  main.cpp
//  HelloWorld
//
//  Created by  on 2024/11/28.
//#include <iostream>struct vector2
{float x, y;};
struct vector4 {union {struct{float x, y, z, w;};struct{vector2 a, b;//a对应x,y;b对应z,w};};//union中的各个成员占用同一块内存
};
void printVector2(const vector2 &v)
{std::cout << v.x << "," << v.y << std::endl;
}
int main(int argc, const char * argv[]) {vector4 v = { 1.0f,2.0f,3.0f,4.0f };printVector2(v.a);printVector2(v.b);v.z = 5;std::cout <<  "-------------" <<  std::endl;printVector2(v.a);printVector2(v.b);
}

打印结果如下: 

 

关键字:西安专用网站建设_小程序制作流程收费_互联网金融营销案例_小红书推广

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: