0
点赞
收藏
分享

微信扫一扫

c++基础(类型转换)

像我的老伙伴 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;
    }
};

举报

相关推荐

C++——类型转换

C++类型转换

C/C++类型转换

【C++】C++的类型转换

C++的类型转换

C++强制类型转换

0 条评论