0

我一直在尝试为二维数组分配动态内存。经过大量搜索后,我发现了一个看起来比其他代码更容易的代码,但我仍然无法理解它的每一个细节。有人可以解释一下以下代码如何动态地为数组分配内存。真的很期待帮助和抱歉,但我是 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;
}
4

6 回答 6

3

该代码仅使用一个内存块来表示所有元素,因此要访问一个样本( i, j ),它需要计算索引存在i * num_rows + j(或 num_colums,具体取决于您如何看待它)。

但正如评论的那样,不要使用new int....,使用类似的东西

std::vector< int > a( m * n );
于 2013-07-30T09:59:51.143 回答
1

尽管 Paul R 说了什么并且我完全支持,但上面代码中的注释是错误的,您不能a[m][n]用于正确寻址已分配为一维内存的数组。

如果你真的必须在不使用向量或数组等 C++ 标准容器的情况下工作,你能做的就是分配整个块,然后将地址存储到行的开头

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++ 容器

于 2013-07-30T10:05:06.047 回答
1

首先,让我指出,这不是一个二维数组,而是一个一维数组。您可以看到它int* a = new int[ m*n ]为 size 的整数分配了一个数组m*n

要获得二维数组,您可以使用int** a = new int*[m]. *请注意此处使用的两个星号 ( )。分配了数组的“第一个”维度后,您现在必须通过以下方式分配第二个维度:

for( int i = 0; i < m; i++ )
{
   a[i] = new int[n];
}

之后,您可以循环mn使用a[i][j]来访问数组内容。

使用 C++ 中的 STL,您可以通过使用二维向量来获得二维数组,如下所示:

std::vector< std::vector<int> > array( rows,
                                       std::vector<int>( columns ) );

这将分配一个包含整数的二维向量,其中rows第一维columns中的元素和第二维中的元素。这种使用有时不受欢迎,但std::vector可以为您管理内存,这可能很好。

于 2013-07-30T09:59:29.697 回答
1

对于内存,您拥有什么样的数组并不重要,它们都存储为一个内存块,这些可以可视化为一维数组。

在这个例子中,因为你想要一个mxn数组,你分配一个m*n大小的块。这种方式与其他方式之间的区别在于,现在您必须以 1d 的方式访问您的数组。

例如具有以下二维数组:

1 2 3
4 5 6
7 8 9

它将按如下方式存储在内存中:

1 2 3 4 5 6 7 8 9

我认为您可以看到这种模式:为了a[i][j]从您的 2d 数组中访问,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];

这将创建一个nxm数组。

于 2013-07-30T10:02:44.187 回答
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]

这就是您制作动态二维数组的方式(换句话说,指向数组的指针数组):

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];

然后,您可以使用双循环(未测试)向该数组添加多个元素:

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

这是打印二维数组内容的方法:

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

}
于 2013-07-30T10:03:43.590 回答
-1

动态就像 int * p = new int [10][10] 然后 * (p+(i*noofcols)+j) 给出值

于 2013-07-30T10:00:50.940 回答