C++ 中將一維數(shù)組轉(zhuǎn)成多維的三種方式示例詳解
使用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.a和s1是指針可互換的。
如何將一維指針轉(zhuǎn)換成多維指針呢?看一個(gè)例子,
#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后將這個(gè)轉(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],這里訪問(wèn)一定要知道arr指針中的元素個(gè)數(shù),防止越界。
使用static_cast
static_cast操作符可用于將一個(gè)指向基類的指針轉(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)換??匆粋€(gè)簡(jiǎn)單的例子:
float c[4] = {1,2,3,4};
float (&b)[4] = *static_cast<float(*)[4]>(&c);
cout<<b[1]<<endl;上面例子b是一個(gè)數(shù)組變量的引用,float(*)[4]是指向數(shù)組的指針,*static_cast<float(*)[4]>是取指針的值,也就是數(shù)組的首地址,b正是這個(gè)首地址的引用。
轉(zhuǎn)換成多維數(shù)組時(shí),之所以需要先轉(zhuǎn)成void*是static_cast轉(zhuǎn)換約束的限制,如果使用reinterpret_cast它可以強(qiáng)制性的將一個(gè)指針類型轉(zhuǎn)換成另一種不會(huì)做檢查,因此就不需要先轉(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_cast和reinterpret_cast時(shí),應(yīng)優(yōu)先使用static_cast.
到此這篇關(guān)于C++ 中將一維數(shù)組轉(zhuǎn)成多維的三種方式的文章就介紹到這了,更多相關(guān)C++ 維數(shù)組轉(zhuǎn)成多維內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用C++實(shí)現(xiàn)給PDF文檔添加文字水印
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)第三方國(guó)產(chǎn)庫(kù)Spire.PDF?for?C++來(lái)實(shí)現(xiàn)給PDF文檔添加文字水印,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11
C++ Boost Serialization庫(kù)超詳細(xì)獎(jiǎng)金額
Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱2022-12-12
復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實(shí)現(xiàn)代碼
復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實(shí)現(xiàn)代碼。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-10-10
C++ string類getline()用法實(shí)例詳解
C++ getline()是一種標(biāo)準(zhǔn)庫(kù)函數(shù),用于從輸入流中讀取字符串或行,它是<string>標(biāo)頭的一部分,本文介紹C++ string類getline()用法詳解,感興趣的朋友一起看看吧2024-03-03
解析C++中的虛擬函數(shù)及其靜態(tài)類型和動(dòng)態(tài)類型
虛擬函數(shù)(Visual Function)亦常被成為虛函數(shù),是C++中的一個(gè)重要特性,本文我們就來(lái)解析C++中的虛擬函數(shù)及其靜態(tài)類型和動(dòng)態(tài)類型2016-06-06

