在 C++ 中初始化指针数组
Initializing array of pointers in C++
我忘记了如何在 C++ 中初始化指针数组,如下所示:
int * array[10];
这样的解决方案合适吗?这里:
array = new int[10];
// Is this the correct way?
int **array = new int*[length];
或者,没有动态内存分配:
int *array[10];
First int* array[10]
将创建一个包含 10 个 Int 指针的数组,这些指针将被初始化为垃圾值,因此最佳实践是
int* array[10];
for(int i = 0;i<10;i++)
{
array[i] = NULL;
}
这将安全地将所有指针统一到一个适当的值,这样如果您尝试访问一个您没有存储内容的指针,它每次都会抛出段错误。
Second array = new int[10]
正在创建一个指向 10 个整数数组的指针,这是完全不同的事情。如果你想使用 new
设置一个指针数组,那就是
int** array = new int*[10];
您可以使用
int* a = {new int(....), new int(....) ,...
或类似下面的内容
for (int b = 0; b < 10; ++b)
a[b] = new int(....);
我认为this link对指针数组有很好的解释。
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
}
你可以有这样的东西-
int **array = new int*[n](); //n is the number of pointers you need.
//() after declaration initializes all pointers with nullptr
一般来说,在大多数情况下,用精确地址初始化数组没有什么意义。您可以在使用数组期间分配地址或分配适当的内存。
通常用空指针初始化一个指针数组是有意义的。例如
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
};
这种初始化经常用于函数指针数组。
我忘记了如何在 C++ 中初始化指针数组,如下所示:
int * array[10];
这样的解决方案合适吗?这里:
array = new int[10];
// Is this the correct way?
int **array = new int*[length];
或者,没有动态内存分配:
int *array[10];
First int* array[10]
将创建一个包含 10 个 Int 指针的数组,这些指针将被初始化为垃圾值,因此最佳实践是
int* array[10];
for(int i = 0;i<10;i++)
{
array[i] = NULL;
}
这将安全地将所有指针统一到一个适当的值,这样如果您尝试访问一个您没有存储内容的指针,它每次都会抛出段错误。
Second array = new int[10]
正在创建一个指向 10 个整数数组的指针,这是完全不同的事情。如果你想使用 new
设置一个指针数组,那就是
int** array = new int*[10];
您可以使用
int* a = {new int(....), new int(....) ,...
或类似下面的内容
for (int b = 0; b < 10; ++b)
a[b] = new int(....);
我认为this link对指针数组有很好的解释。
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
}
你可以有这样的东西-
int **array = new int*[n](); //n is the number of pointers you need.
//() after declaration initializes all pointers with nullptr
一般来说,在大多数情况下,用精确地址初始化数组没有什么意义。您可以在使用数组期间分配地址或分配适当的内存。
通常用空指针初始化一个指针数组是有意义的。例如
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
};
这种初始化经常用于函数指针数组。