c++基础(类型转换)

作者: zidea | 来源:发表于2019-05-05 12:04 被阅读16次
    Cplusplus-tutorial-in-hindi.jpg

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

    相关文章

      网友评论

        本文标题:c++基础(类型转换)

        本文链接:https://www.haomeiwen.com/subject/wlfonqtx.html