没有声明的C ++多维指针数组

时间:2016-03-31 20:56:28

标签: c++ arrays pointers global-variables

我想声明多维(在他的情况下为二维)数组。我无法声明全局数组的大小。一个维度,一切正常:

#include <iostream>
#include <fstream>

using namespace std;

int N, M;
bool *table;

int main()
{
    ifstream in ("in.txt");
    in >> N >> M;

    table = new bool[N];

    return 0;
}

但是如果我想声明二维数组,我会收到一个错误: 的&#39; M&#39;不能出现在常量表达式

#include <iostream>
#include <fstream>

using namespace std;

int N, M;
bool **table;

int main()
{
    ifstream in ("in.txt");
    in >> N >> M;

    table = new bool[N][M];

    return 0;
}

除了在主函数中声明数字而不是N和M,创建向量数组或声明之外,我的选择是什么?

3 个答案:

答案 0 :(得分:0)

  

除了声明数字而不是N和M,在main函数中创建向量数组或声明表之外,我的选择是什么?

N指针分配内存 对于每个指针,为M类型的bool元素分配内存。

table = new bool*[N];
for (int i = 0; i < N; ++i )
{
   table[i] = new bool[M];
}

当需要解除分配时,请使用:

for (int i = 0; i < N; ++i )
{
   delete [] table[i];
}

delete [] table;

使用std::vector可以避免内存分配和释放的所有麻烦。

std::vector<std::vector<bool>> table(N, std::vector<bool>(M));

答案 1 :(得分:0)

使用旧方法:分配一维数组,然后通过计算(i * N + j)通过唯一索引访问它。如果你想隐藏它,可以创建一个带有两个参数的函数。

答案 2 :(得分:0)

如果你想避免真正的多级数组的所有麻烦,你可以:

int N=2, M=3;
bool *table = new bool[N*M];

// to access the element at (n,m):

ele = table[n*M + m];   

这使得所有的分配/解除分配变得简单,只需要在访问元素时输入更多的代价就可以了。当然,您可以使用宏来修复它。