最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

使用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。

強制類型轉(zhuǎn)換

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

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

使用static_cast

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

  • 基類(父類)和派生類(子類)之間指針或引用的轉(zhuǎn)換
  • void指針轉(zhuǎn)換成目標類型的指針
  • 數(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它可以強制性的將一個指針類型轉(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)換是有保護的,如果同樣能使用static_castreinterpret_cast時,應優(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)文章

  • QT中對Mat類的一些操作詳解

    QT中對Mat類的一些操作詳解

    本文主要介紹了QT中對Mat類的一些操作詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • C++中的vector容器對象學習筆記

    C++中的vector容器對象學習筆記

    這篇文章主要介紹了C++中的vector容器對象學習筆記,其中文章最后標紅的resize與reserve方法的差別特別需要注意,需要的朋友可以參考下
    2016-05-05
  • C++深淺拷貝和string類的兩種寫法詳解

    C++深淺拷貝和string類的兩種寫法詳解

    這篇文章主要為大家詳細介紹了C++深淺拷貝和string類的兩種寫法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 算法詳解之回溯法具體實現(xiàn)

    算法詳解之回溯法具體實現(xiàn)

    這篇文章主要介紹了算法詳解之回溯法具體實現(xiàn),需要的朋友可以參考下
    2014-02-02
  • C++中空指針訪問成員函數(shù)的實現(xiàn)

    C++中空指針訪問成員函數(shù)的實現(xiàn)

    本文主要介紹了C++中空指針訪問成員函數(shù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-02-02
  • 深入解析C++和JAVA的字符串

    深入解析C++和JAVA的字符串

    這篇文章主要介紹了C++和JAVA的字符串,JAVA 中String 和StringBuffer的區(qū)別,需要的朋友可以參考下
    2015-07-07
  • C語言學生成績管理系統(tǒng)小設計

    C語言學生成績管理系統(tǒng)小設計

    這篇文章主要為大家詳細介紹了C語言學生成績管理系統(tǒng)小設計,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C語言實現(xiàn)電影院選座管理系統(tǒng)

    C語言實現(xiàn)電影院選座管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)電影院選座管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • c++通過引用實現(xiàn)三個數(shù)字求最大值

    c++通過引用實現(xiàn)三個數(shù)字求最大值

    下面我們將通過這個例子來說明引用的作為函數(shù)參數(shù)的使用方法。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • C++雙向鏈表的增刪查改操作方法講解

    C++雙向鏈表的增刪查改操作方法講解

    相較單鏈表,雙向鏈表除了data與next域,還多了一個pre域用于表示每個節(jié)點的前一個元素。這樣做給雙向鏈表帶來了很多優(yōu)勢。本文主要介紹了雙向鏈表的實現(xiàn),需要的可以參考一下
    2023-03-03

最新評論

澜沧| 永德县| 若尔盖县| 苍南县| 灵石县| 苍溪县| 绍兴县| 惠水县| 赤城县| 嘉定区| 射洪县| 抚宁县| 如皋市| 南雄市| 怀柔区| 凤城市| 潍坊市| 麻城市| 通化市| 含山县| 巴南区| 曲周县| 宁波市| 逊克县| 普兰店市| 潢川县| 南漳县| 百色市| 楚雄市| 拜城县| 汾西县| 广宗县| 兴海县| 竹北市| 南开区| 剑川县| 许昌县| 漳浦县| 融水| 平昌县| 天门市|