欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ 中將一維數(shù)組轉(zhuǎn)成多維的三種方式示例詳解

 更新時間:2023年12月26日 10:08:37   作者:恒友成  
這篇文章主要介紹了C++ 中將一維數(shù)組轉(zhuǎn)成多維的三種方式,每種方式結(jié)合實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧

使用reinterpret_cast

reinterpret_cast作用為:允許將任何指針轉(zhuǎn)換為任何其他指針類型。

#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是指針可互換的。

如何將一維指針轉(zhuǎn)換成多維指針呢?看一個例子,

#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]是數(shù)組指針類型,指向形如[I][J][K]數(shù)組的首地址,reinterpret_cast后將這個轉(zhuǎn)換結(jié)果賦值給了arr3d。

強(qiáng)制類型轉(zhuǎn)換

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

這里是將arr轉(zhuǎn)換成float(*)[I][J]的數(shù)組指針,arr3d1相當(dāng)于指向[I][J][K]數(shù)組的行指針[I][J][0],這里訪問一定要知道arr指針中的元素個數(shù),防止越界。

使用static_cast

static_cast操作符可用于將一個指向基類的指針轉(zhuǎn)換為指向子類的指針。但是這樣的轉(zhuǎn)換不總是安全的。static_cast不夠安全,就是指在運(yùn)行階段不進(jìn)行類型檢查。其主要作用是:

  • 基類(父類)和派生類(子類)之間指針或引用的轉(zhuǎn)換
  • void指針轉(zhuǎn)換成目標(biāo)類型的指針
  • 數(shù)字類型轉(zhuǎn)換,一般情況下,可以使用static_cast用于數(shù)字類型的轉(zhuǎn)換,如把枚舉轉(zhuǎn)換為int或是 float類型。
float (&arr3d2)[I][J][K] = *static_cast<float (*)[I][J][K]>(static_cast<void*>(arr));
cout << arr3d2[0][0][0] << endl;

上面例子中先將float*轉(zhuǎn)換成了void*,然后將void*轉(zhuǎn)換成了float (*)[I][J][K]類型,再取指針變量的值作為數(shù)組arr3d2的引用,如此就完成了類型轉(zhuǎn)換??匆粋€簡單的例子:

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

上面例子b是一個數(shù)組變量的引用,float(*)[4]是指向數(shù)組的指針,*static_cast<float(*)[4]>是取指針的值,也就是數(shù)組的首地址,b正是這個首地址的引用。

轉(zhuǎn)換成多維數(shù)組時,之所以需要先轉(zhuǎn)成void*static_cast轉(zhuǎn)換約束的限制,如果使用reinterpret_cast它可以強(qiáng)制性的將一個指針類型轉(zhuǎn)換成另一種不會做檢查,因此就不需要先轉(zhuǎn)成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類型轉(zhuǎn)換是有保護(hù)的,如果同樣能使用static_castreinterpret_cast時,應(yīng)優(yōu)先使用static_cast.

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

到此這篇關(guān)于C++ 中將一維數(shù)組轉(zhuǎn)成多維的三種方式的文章就介紹到這了,更多相關(guān)C++ 維數(shù)組轉(zhuǎn)成多維內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用C++實現(xiàn)給PDF文檔添加文字水印

    使用C++實現(xiàn)給PDF文檔添加文字水印

    這篇文章主要為大家詳細(xì)介紹了如何通過第三方國產(chǎn)庫Spire.PDF?for?C++來實現(xiàn)給PDF文檔添加文字水印,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • 在C/C++項目中合理使用宏詳解

    在C/C++項目中合理使用宏詳解

    這篇文章主要介紹了在C/C++項目中合理使用宏詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C++ Boost Serialization庫超詳細(xì)獎金額

    C++ Boost Serialization庫超詳細(xì)獎金額

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱
    2022-12-12
  • 復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實現(xiàn)代碼

    復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實現(xiàn)代碼

    復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實現(xiàn)代碼。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • C++ string類getline()用法實例詳解

    C++ string類getline()用法實例詳解

    C++ getline()是一種標(biāo)準(zhǔn)庫函數(shù),用于從輸入流中讀取字符串或行,它是<string>標(biāo)頭的一部分,本文介紹C++ string類getline()用法詳解,感興趣的朋友一起看看吧
    2024-03-03
  • C++中的關(guān)鍵字volatile詳解

    C++中的關(guān)鍵字volatile詳解

    這篇文章主要介紹了C++中的關(guān)鍵字volatile使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • 基于QT實現(xiàn)文件上傳和下載功能

    基于QT實現(xiàn)文件上傳和下載功能

    這篇文章主要為大家詳細(xì)介紹了基于QT實現(xiàn)文件上傳和下載功能,支持?jǐn)帱c續(xù)傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++實現(xiàn)酒店管理系統(tǒng)

    C++實現(xiàn)酒店管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)酒店管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C++入門指南之貪吃蛇游戲的實現(xiàn)

    C++入門指南之貪吃蛇游戲的實現(xiàn)

    這篇文章主要給大家介紹了關(guān)于C++入門指南之貪吃蛇游戲?qū)崿F(xiàn)的相關(guān)資料,文章通過示例代碼介紹的非常詳細(xì),可以讓大家能短時間內(nèi)寫出一個貪吃蛇,需要的朋友可以參考下
    2021-10-10
  • 解析C++中的虛擬函數(shù)及其靜態(tài)類型和動態(tài)類型

    解析C++中的虛擬函數(shù)及其靜態(tài)類型和動態(tài)類型

    虛擬函數(shù)(Visual Function)亦常被成為虛函數(shù),是C++中的一個重要特性,本文我們就來解析C++中的虛擬函數(shù)及其靜態(tài)類型和動態(tài)類型
    2016-06-06

最新評論