我一直在尝试为二维数组分配动态内存。在搜索了很多之后,我发现了一个看起来比其他人更容易的代码,但我无法理解它的每一个细节。有人可以解释一下,以下代码如何动态地为数组分配内存。真的很期待帮助和抱歉,但我是C ++的新手,想要学习它。
void main()
{
int m,n;
cin>>m;
cin>>n;
//Allocate
int *a = new int[m*n];
//Use a[m][n]
for( int i = 0 ; i < m ; i++)
for ( int j = 0 ; j < n ; j++)
a[i*n + j] = 1;
}
答案 0 :(得分:3)
代码只使用一个内存块来表示所有元素,因此要访问样本( i, j )
,它需要计算索引i * num_rows + j
(或num_colums,具体取决于你如何看待它)。< / p>
但如评论所述,请勿使用new int....
,请使用
std::vector< int > a( m * n );
答案 1 :(得分:1)
首先,我要指出,这不是一个二维数组,而是一维数组。您可以看到int* a = new int[ m*n ]
为大小为m*n
的整数分配数组。
要获得二维数组,可以使用int** a = new int*[m]
。请注意此处使用的两个星号(*
)。分配了数组的“第一”维度后,您现在必须通过以下方式分配第二个维度:
for( int i = 0; i < m; i++ )
{
a[i] = new int[n];
}
之后,您可以循环m
和n
并使用a[i][j]
来访问数组内容。
在C ++中使用STL,您可以使用二维向量获取二维数组,如下所示:
std::vector< std::vector<int> > array( rows,
std::vector<int>( columns ) );
这将分配包含整数的二维向量,第一维中包含rows
个元素,第二维中包含columns
个元素。这样的使用有时是不受欢迎的,但是std::vector
管理你的记忆,这可能很好。
答案 2 :(得分:1)
对于内存来说,无论你拥有什么样的数组,它们都被存储为一个内存块,那些可以被视为一维数组。
在此示例中,由于您要隐藏m
x n
数组,因此需要调整m*n
大小的块。这种方式与其他方式的区别在于,现在您必须以1d的方式访问数组。
例如,有下面的2d数组:
1 2 3
4 5 6
7 8 9
它将按如下方式存储在存储器中:
1 2 3 4 5 6 7 8 9
我认为您可以看到模式:为了从您的二维数组中访问a[i][j]
,1d的等效值为a[i*dim+j]
,其中dim
是您的行的长度。
访问阵列的方式完全取决于分配方式。为了能够直接以arr[i][j]
的形式访问您的元素,您需要分配以下内存:
int **arr = new int *[n];
for (int i=0; i<n; i++)
arr[i] = new int [m];
这将创建一个n
x m
数组。
答案 3 :(得分:1)
首先,你正在做的是将1添加到一维数组的不同插槽中。
以下是您的代码的注释版本:
int *a = new int[m*n]; // declares a pointer a, that points to a newly
// allocated space on the heap, for an array of size m*n.
for( int i = 0 ; i < m ; i++) // loop through m number of times
for ( int j = 0 ; j < n ; j++) // loop through n number of times PER m
a[i*n + j] = 1; // assigns 1 to a spot [i*n + j]
这就是你如何制作动态2D数组(换句话说,指向数组的指针数组):
const int sizeX = 10;
const int sizeY = 5;
int** arrayOfPointers = new int*[sizeX];
for(int i = 0; i < sizeX; i++)
arrayOfPointers[i] = new int[sizeY];
然后,您可以使用双循环(NOT TESTED)向该数组添加多个元素:
for(int i = 0 ; i < sizeY ; i++) // loop through all the rows
for (int j = 0 ; j < sizeX ; j++) // loop through all columns for row i
arrayOfPointers[i][j] = i*j; // assigns i*j to a spot at row i, column j
这是打印2D数组内容的方法:
for(int i = 0 ; i < sizeY ; i++) {
for (int j = 0 ; j < sizeX ; j++)
cout << arrayOfPointers[i][j];
cout << endl; // go to the next line when the row is finished
}
答案 4 :(得分:1)
尽管Paul R所说的并且我完全支持,但上面代码中的注释是错误的,你不能使用a[m][n]
来正确寻址已被分配为一维内存的数组。
你可以做什么,如果真的必须在不使用C ++标准容器(如vector或array)的情况下工作,那就是分配整个块,然后将地址存储到行的开头
int** createTwoDimMatrix(unsinged int rows, unsigned int columns)
{
int** rowAdressTable = new int*[rows];
int* baseMemory = new int[rows*columns];
//fill the rowAddressTable
for(unsinged int r=1; r<rows; ++r)
{
rowAdressTable[r] = rowsAdressTable[r-1]+columns*sizeof(int)
}
return rowAdressTable;
}
但让我再说一遍:请考虑使用C ++容器
答案 5 :(得分:-1)
动态就像 int * p = new int [10] [10] 然后* (p +(i * noofcols)+ j)给出值