像我的老伙伴 javascript 天生是没有类型系统,只从服用了typescript
之后才有了类型系统。
像 java 这样静态语言有着自己一套严格的类型系统。不过一旦为变量声明类型也并不是一层不变的。可通过类型转换来实现更改变量的类型。
不过 c++ 可直接访问内存,所在直接不许隐式类型转换,我们可以通过操作和方法内存将内存指向内存地址进行类型转换。
其实我们所谓类型,就是数字进行分类,根据类型分配不同大小内存地址,然后赋予类型一定的能力和行为。
所以究其底层他就是数值,就是 0 和 1 ,一切都是我们进行抽象的。所以我们只要获取到数据说的他是啥就是啥
#include <iostream>
int main(int argc, char const *argv[])
{
int a = 5;
double val = a;
std::cin.get();
}
int main()
{
int a = 50;
double val = *(double *)&a;
std::cout
<< val << std::endl;
std::cin.get();
}
- 首先通过 & 对变量 a 进行取址操作返回指向 int 类型的指针。
- 然后通过
double*
将指针转换为指向 double 类型的指针
说以这回输出值是异常的
-1.34546e+163
这个只是为了演示没有什么实际意义
struct Pointer
{
int x, y;
};
int main()
{
int a = 50;
double val = *(double *)&a;
Pointer p = {5, 8};
int *arr = &p.x;
std::cout
<< arr[0] << " , " << arr[1] << std::endl;
std::cin.get();
}
在这个例子中,我们可以定义 struct Pointer ,其中包含两个 int 类型成员 x,y 变量。当我们实例 Pointer 也就是相当分配给 Pointer 一个连续的 8 字节的内存空间。但从数据存放的角度来看也可以看出数组。
int y = *(int *)((char *)&p + 4);
std::cout << "y = " << y << std::endl;
这里大家可以理解一下,我们将 &p 地址转换为指向 char 类型的地址指针,我们知道 char 类型大小是 1 个字节,所以 + 4 就表示已 char 地址大小进行步进,也就是到了 y 内存地址位置然后再转型为指向 int 类型的指针。最后在取值即可。
struct Pointer
{
int x, y;
int *GetPositions()
{
return &x;
}
};
titleShadow.png
网友评论