int *p[3]; // The vector addresses reside on the stack.
for (int i=0; i<3; i++) {
p[i] = malloc(4 * sizeof(int)); // Each element resides on the heap.
}
// You can now access p as p[j][k] as if it were a 2D array.
for (int i=0; i<3; i++) {
free p[i];
}
型 或者,如果你不知道任何一个维度,你可以动态分配整个2D数组:
#define WIDTH 3
#define HEIGHT 4
int **p; // Base address resides on the stack.
p = malloc(WIDTH * sizeof(int *)); // Pointers to vectors reside on the heap.
for (int i=0; i<WIDTH; i++) {
p[i] = malloc(HEIGHT * sizeof(int)); // Data values reside on the heap.
}
// You can now access p as p[j][k] as if it were a 2D array.
// Release the memory that was allocated to each vector.
for (int i=0; i<WIDTH; i++) {
free(p[i]);
}
// Release the memory that was allocated to the initial pointer.
free(p);
int **array_ptr; //two * are needed because it is a pointer to a pointer
array_ptr=new int*[firstnumber]; //creates a new array of pointers to int objects
for(int i=0; i<firstnumber; ++i)
array_ptr[i]=new int[secondnumber];
6条答案
按热度按时间mpbci0fu1#
看来你需要一对一。编辑:好吧,更确切地说,下面的例子创建了 * 一个指向数组的指针数组 *。
第一步:
字符串
这里你已经创建了一个指针数组。现在您需要为它们中的每一个创建另一个数组。你可以这样做:
型
对于释放,您可以执行类似的操作,但以相反的方式执行:
型
最后:
型
现在你可以使用它。这样就可以创建N维数组,只需添加更多的'*'。如果你有任何其他特别的问题,请在评论中提出。
但是,一般来说,为了进一步的信息,我建议你先尝试谷歌的问题,如“2D数组在C++”或“动态分配2D数组C++”,即。即this query。
hiz5n14c2#
其他答案包括为您的行设置一个指针数组,每行指向一个
int
数组的指针。另一种选择是简单地分配一个足够大的一维数组来容纳所有二维数组的元素:字符串
然后使用
p[r * kNumCols + c]
而不是p[r][c]
语法。在这个例子中,kNumCols = 4
。这通常是LAPACK风格的数字运算所做的,因为它使内存中的内容保持连续,并且不需要分配这么多内存块。注意:在实践中,这通常 * 不 * 比替代方案慢,因为行偏移计算被公共子表达式优化移出了循环。此外,许多优化器都知道寻找这种模式。此外,通过将数据放在单个内存块中,数据更有可能留在缓存中。
在C++中,你可以用一个helper模板类来实现
p[][]
符号:型
这优化到与上面相同的代码,但允许您使用
[][]
表示法,并且 * 要求您在编译时知道数组的维数 *。使用示例:型
这可以转换为NC成为类成员而不是模板参数,但最终对象不再只是指针:
型
请注意,这些类都不需要复制构造函数、赋值运算符或析构函数,因为它们不像常规指针那样拥有所指向内存的所有权。所以要释放内存,你仍然需要做:
型
或者如果你的编译器不能解决这个问题:
型
h9a6wy2h3#
来回答这个问题
记住,一个数组相当于一个指向数组第一个元素的指针,所以例如你可以写:
字符串
这也适用于二维数组。
型
声明指向二维数组第一个元素的指针。然后
p
可以指向任何二维数组,只要它的第二个维度是4,所以例如你可以写型
当然,你也可以动态地分配内存:
型
同样,第二个维度必须是4,但您可以改变第一个维度。
ncgqoxb04#
在C中有几种声明多维数组的方法。
可以将
p
显式声明为2D数组:字符串
(Note
new
在这里对于基本类型是不需要的,除非你使用的是C++并且想在堆上分配它们。或者你可以将它声明为指针的向量(1D数组),然后为每个向量分配内存:
型
或者,如果你不知道任何一个维度,你可以动态分配整个2D数组:
型
0ve6wy6x5#
你需要这样的东西
字符串
6fe3ivhb6#
已经有一个很好的答案了,但是我想在不使用(new,delete)的情况下分配一个2d数组。所以我使用了std::vector。
字符串