在C中初始化指针数组

新手上路,请多包涵

我忘记了如何在 C++ 中初始化指针数组,如下所示:

 int * array[10];

这是一个合适的解决方案吗?这里:

 array = new int[10];

 // Is this the correct way?

原文由 perkes456 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 668
2 个回答
int * array[10];

在 10 个 int 数组上静态定义 10 个指针

动态:

 int **array = new int *[10];

更好的解决方案,因为您使用 C++:使用 std::vector

 std::vector<int *> v;
v.resize(10);
v[2] = new int[50];  // allocate one array

由于我们使用向量作为指针数组,让我们完全摆脱指针

std::vector<std::vector<int> > v;
v.resize(10);
v[2].resize(50);  // allocate one array

然后像矩阵一样访问数组:

 v[3][40] = 14;

更进一步,一种初始化所有行的方法,使用 C++11,最后制作一个 10x50 int 矩阵(但如果我们愿意,大小也可以在循环内改变)。需要 gcc 4.9 和 g++ -std=c++11 来构建

std::vector<std::vector<int> > v;
v.resize(10);
for (auto &it : v)
{
   it.resize(50);  // allocate arrays of 50 ints
}

原文由 Jean-François Fabre 发布,翻译遵循 CC BY-SA 4.0 许可协议

一般来说,在大多数情况下,用确切的地址初始化数组没有多大意义。您可以在数组使用期间分配地址或分配适当的内存。

通常用空指针初始化一个指针数组是有意义的。例如

int * array[10] = {};

如果您想声明数组并立即为数组的每个元素分配内存,您可以编写例如

int * array[10] =
{
    new int, new int, new int, new int, new int, new int, new int, new int, new int, new int
};

或者

int * array[10] =
{
    new int( 0 ), new int( 1 ), new int( 2 ), new int( 3 ), new int( 4 ), new int( 5 ), new int( 6 ), new int( 7 ), new int( 8 ), new int( 9 )
};

但无论如何,最好使用一些循环或标准算法进行分配,因为通常数组可以有超过 10 个元素。

此外,您不应忘记删除所有已分配的内存。例如

std::for_each( std::begin( array ), std::end(array ), std::default_delete<int>() );

或者,如果您已经定义了 int 类型的对象,您可以编写例如

int x0, x1, x2, x3, x4, x5, x6, x7, x8, x9;
//...
int * array[10] =
{
    &x0, &x1, &x2, &x3, &x4, &x5, &x6, &x7, &x8, &x9
};

这种初始化经常用于函数指针数组。

原文由 Vlad from Moscow 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题