我需要创建一个带有动态分配内存的二维数组(这两个维度都将在运行时设置),但出于效率目的,我想创建一个具有连续分配内存的一维版本,但又一些想要的将它用作二维数组。有没有办法使用强制转换来实现这一点。 我想要实现的用法如下,显然不起作用。 最好,
int size = 4;
int* arr = new int[size];
arr[0] = 10;
arr[1] = 11;
arr[2] = 12;
arr[3] = 13;
cout << (int[][2])arr[1][1] << endl;
答案 0 :(得分:2)
由于这是C ++,你可以包装一维数组(由于地点要求而必需)和重载operator()
以允许使用一些合适的索引计算进行二维访问。
答案 1 :(得分:2)
虽然我认为Codor的解决方案最符合C ++的编码风格,但我想以C风格分享我的解决方案。
#include <iostream>
typedef int (*pint2)[2]; //pint2 is a pointer to an array of 2 ints
int main()
{
int arr[4] = { 0, 1, 2, 3 };
pint2 parr = (pint2)arr;
std::cout << parr[0][0] << std::endl;
std::cout << parr[0][1] << std::endl;
std::cout << parr[1][0] << std::endl;
std::cout << parr[1][1] << std::endl;
getchar();
return 0;
}
希望这有帮助! (或者至少你发现这很有趣:/)
编辑:对于可变长度的数组!
#include <iostream>
int main()
{
int arr[12] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
const int sizeofarr = sizeof(arr)/sizeof(arr[0]); //Number of elements in array
{
const int numofrows = 2; //Number of rows
const int numofcolumns = sizeofarr/numofrows; //Number of columns
typedef int (*pinta)[sizeofarr/numofrows]; //A 2D array of columns of 2
pinta parr = (pinta)arr;
for(int i = 0; i < numofrows; ++i)
for(int j = 0; j < numofcolumns; ++j)
std::cout << parr[i][j] << std::endl;
}
{
const int numofrows = 3; //Number of rows
const int numofcolumns = sizeofarr/numofrows; //Number of columns
typedef int (*pinta)[sizeofarr/numofrows]; //A 2D array of columns of 3
pinta parr = (pinta)arr;
for(int i = 0; i < numofrows; ++i)
for(int j = 0; j < numofcolumns; ++j)
std::cout << parr[i][j] << std::endl;
}
getchar();
return 0;
}
答案 2 :(得分:0)
g ++使用-fpermissive:
编译以下略微更改的行(运算符优先级)cout << ((int[][2])arr)[1][1] << endl;
我认为它是UB(任何人?)但我也认为它在所有“常见”平台上都能正常工作。