在 C++ 中初始化指针数组

Posted

技术标签:

【中文标题】在 C++ 中初始化指针数组【英文标题】:Initializing array of pointers in C++ 【发布时间】:2016-08-12 13:58:59 【问题描述】:

我忘记了如何,如下所示:

int * array[10];

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

array = new int[10];

 // Is this the correct way?

【问题讨论】:

如果指针是另一个结构的对象 - 即。用户定义的结构......我猜它是一样的方式?? @sorosh_sabz 你能举个例子吗? int * array[10] = ; 初始化指向nullptr的指针。 “如何初始化指针数组” 这取决于你想要初始化它的什么。练习的目标是什么? 你可能想要int * array[10] = new int, new int, ...; ? @Jean-FrançoisFabre 这是aggregate initialization,来自 C++98 (?) 【参考方案1】:
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

【讨论】:

这几乎涵盖了我需要的全部内容!谢谢! 更好的是,静态部分使用std::array,例如std::array&lt;std::vector&lt;int&gt;, 10&gt;. 不知道。好一个。但是 OP 希望它是动态的。我会记住这一点的。 我一定是不小心点到了它,它现在就在那里 :)【参考方案2】:

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

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

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 
; 

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

【讨论】:

【参考方案3】:
int **array = new int*[length];

或者,没有动态内存分配:

int *array[10];

【讨论】:

这也不是...有人能告诉我在初始化时是否应该使用带有指针数组的运算符“NEW”...天哪,哈哈 如果你不想动态分配:int *array[50]; new 运算符专门用于从堆中动态分配内存,它不是由编译器静态分配的,因此使用 new 与常规方式有很大不同,除了您必须专门删除记忆 @perkes456 这就是答案。你在你的问题中做了两件不同的事情。一个是堆栈上的指针数组,另一个是堆上的动态指针数组。这个答案给了你两种方法,选择你想要的。【参考方案4】:

首先 int* array[10] 将创建一个包含 10 个 Int 指针的数组,该数组将被初始化为垃圾值,因此最佳实践是

int* array[10];
for(int i = 0;i<10;i++)

    array[i] = NULL;

这将安全地将所有指针统一到一个适当的值,这样如果你尝试访问一个你没有在其中存储东西的指针,每次都会抛出一个段错误。

第二 array = new int[10] 正在创建一个指向 10 个整数数组的指针,这是完全不同的事情。如果你想使用new 设置一个指针数组,那将是

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

【讨论】:

您不需要循环将元素初始化为 NULL。请参阅我的第一条评论。也就是说,您所展示的远非最佳实践。 取决于编译器,像 gcc 这样的旧版本没有原语的默认值,这通常意味着分配时内存中仍然存在的碎片位仍然存在并且起始值变量的 根据我对 OP 的评论,int * array[10] = ; 完成。不需要循环。【参考方案5】:

你可以拥有这样的东西-

int **array = new int*[n](); //n is the number of pointers you need.
//() after declaration initializes all pointers with nullptr

【讨论】:

赞成,因为 & 部分回答了问题。 @Jean-FrançoisFabre 除了缺少指针数组的初始化? 我以为他只是想要声明语法。但不管怎样,int **array = new int*[n](); 这也初始化了数组。 他是否要初始化数组是模棱两可的。但是,我同意,这是下一步。我总是尝试深入研究此类基本问题,否则所有答案都是相同的,所以我也涵盖了这部分。 @Jean-FrançoisFabre 傻我,我一定被标题弄糊涂了,“我忘记了如何在 c++ 中初始化指针数组......”【参考方案6】:

你可以使用

int* a = new int(....), new int(....) ,...

或者类似下面的东西

for (int b = 0; b < 10; ++b)
 a[b] = new int(....);

我认为this link 对指针数组有很好的解释。

【讨论】:

以上是关于在 C++ 中初始化指针数组的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用指针初始化 char 数组或字符串

C++二维数组(指针)做参数

在 C++ 中初始化指针数组

如何在 C++ 中初始化指向动态二维数组的指针 [关闭]

C++ 指针和 C 风格的数组初始化

在 C++ 中使用指针的数组:访问返回的数组时出现分段错误