C++ 中将一维数组转成多维的三种方式示例详解

 更新时间:2023年12月26日 10:08:37   作者:恒友成  
这篇文章主要介绍了C++ 中将一维数组转成多维的三种方式,每种方式结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

使用reinterpret_cast

reinterpret_cast作用为:允许将任何指针转换为任何其他指针类型。

#include <iostream>
int main() {
    int arr4[2] = {0, 12};
    int* p5 = reinterpret_cast<int*>(&arr4);
    cout << p5[1] << std::endl; 
    struct S1 { int a; } s1;
    s1.a  = 100;
    int* p1 = reinterpret_cast<int*>(&s1);
    cout << *p1;   
}
// 12
// 100

上面例子中,p1 是指向s1.a的指针,s1.as1是指针可互换的。

如何将一维指针转换成多维指针呢?看一个例子,

#include <iostream>
using namespace std;
int main()
{
    constexpr const unsigned long n = 8;
    float arr1[n] = {1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f};
    float *arr = new float[n];
    for(int i = 0; i < n; i++) {
        arr[i] = arr1[i];
    }
    // 1.reinterpret_cast
    unsigned long I, J, K;
    I = 2;
    J = 2;
    K = 2;
    cout << arr[0] << endl;
    float (&arr3d)[I][J][K] = *reinterpret_cast<float (*)[I][J][K]>(arr);
    cout << arr3d[0][0][0] << endl;
}

float (*)[I][J][K]是数组指针类型,指向形如[I][J][K]数组的首地址,reinterpret_cast后将这个转换结果赋值给了arr3d

强制类型转换

float(*arr3d1)[I][J] = (float(*)[I][J])arr;
cout << arr3d1[0][0][0] << endl;

这里是将arr转换成float(*)[I][J]的数组指针,arr3d1相当于指向[I][J][K]数组的行指针[I][J][0],这里访问一定要知道arr指针中的元素个数,防止越界。

使用static_cast

static_cast操作符可用于将一个指向基类的指针转换为指向子类的指针。但是这样的转换不总是安全的。static_cast不够安全,就是指在运行阶段不进行类型检查。其主要作用是:

  • 基类(父类)和派生类(子类)之间指针或引用的转换
  • void指针转换成目标类型的指针
  • 数字类型转换,一般情况下,可以使用static_cast用于数字类型的转换,如把枚举转换为int或是 float类型。
float (&arr3d2)[I][J][K] = *static_cast<float (*)[I][J][K]>(static_cast<void*>(arr));
cout << arr3d2[0][0][0] << endl;

上面例子中先将float*转换成了void*,然后将void*转换成了float (*)[I][J][K]类型,再取指针变量的值作为数组arr3d2的引用,如此就完成了类型转换。看一个简单的例子:

float c[4] =  {1,2,3,4};
float (&b)[4] = *static_cast<float(*)[4]>(&c); 
cout<<b[1]<<endl;

上面例子b是一个数组变量的引用,float(*)[4]是指向数组的指针,*static_cast<float(*)[4]>是取指针的值,也就是数组的首地址,b正是这个首地址的引用。

转换成多维数组时,之所以需要先转成void*static_cast转换约束的限制,如果使用reinterpret_cast它可以强制性的将一个指针类型转换成另一种不会做检查,因此就不需要先转成void*

float c[4] =  {1,2,3,4};
float (&b)[2][2] = *static_cast<float(*)[2][2]>(static_cast<void*>(&c)); 
float (&d)[2][2] = *reinterpret_cast<float(*)[2][2]>(&c); 
cout<<b[1][1]<<endl;

从这里也能看出,static_cast类型转换是有保护的,如果同样能使用static_castreinterpret_cast时,应优先使用static_cast.

1.https://stackoverflow.com/questions/310451/should-i-use-static-cast-or-reinterpret-cast-when-casting-a-void-to-whatever

到此这篇关于C++ 中将一维数组转成多维的三种方式的文章就介绍到这了,更多相关C++ 维数组转成多维内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用C++实现给PDF文档添加文字水印

    使用C++实现给PDF文档添加文字水印

    这篇文章主要为大家详细介绍了如何通过第三方国产库Spire.PDF for C++来实现给PDF文档添加文字水印,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • 在C/C++项目中合理使用宏详解

    在C/C++项目中合理使用宏详解

    这篇文章主要介绍了在C/C++项目中合理使用宏详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • C++ Boost Serialization库超详细奖金额

    C++ Boost Serialization库超详细奖金额

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-12-12
  • 复数乘法中的结构体赋值实现代码

    复数乘法中的结构体赋值实现代码

    复数乘法中的结构体赋值实现代码。需要的朋友可以过来参考下,希望对大家有所帮助
    2013-10-10
  • C++ string类getline()用法实例详解

    C++ string类getline()用法实例详解

    C++ getline()是一种标准库函数,用于从输入流中读取字符串或行,它是<string>标头的一部分,本文介绍C++ string类getline()用法详解,感兴趣的朋友一起看看吧
    2024-03-03
  • C++中的关键字volatile详解

    C++中的关键字volatile详解

    这篇文章主要介绍了C++中的关键字volatile使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • 基于QT实现文件上传和下载功能

    基于QT实现文件上传和下载功能

    这篇文章主要为大家详细介绍了基于QT实现文件上传和下载功能,支持断点续传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C++实现酒店管理系统

    C++实现酒店管理系统

    这篇文章主要为大家详细介绍了C++实现酒店管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C++入门指南之贪吃蛇游戏的实现

    C++入门指南之贪吃蛇游戏的实现

    这篇文章主要给大家介绍了关于C++入门指南之贪吃蛇游戏实现的相关资料,文章通过示例代码介绍的非常详细,可以让大家能短时间内写出一个贪吃蛇,需要的朋友可以参考下
    2021-10-10
  • 解析C++中的虚拟函数及其静态类型和动态类型

    解析C++中的虚拟函数及其静态类型和动态类型

    虚拟函数(Visual Function)亦常被成为虚函数,是C++中的一个重要特性,本文我们就来解析C++中的虚拟函数及其静态类型和动态类型
    2016-06-06

最新评论