指向指针的指针如何对应于2D数组?

时间:2013-07-31 04:24:39

标签: c++ pointers memory memory-management heap

我知道之前可能会问这个问题,但我不明白这个问题:

以下是我要检查的代码,我会对此进行评论。请让我知道我哪里错了

int **A;                    // declaring a pointer to a pointer

A = new int*[n];            // assigning that pointer to a newly-allocated 
                            // space (on the heap) for an array
                            // of [size n] of pointers to integers

for (i = 0; i < n; ++i)     // looping from 0 to n-1
    A[i] = new int[n];      // assigning each slot's pointer to a 
                            // new array of size n?

for (i = 0; i < n; ++i)     // loop through all the rows
    for (j = 0; j < n; ++j) // loop through each column for the current row
        A[i][j] = 0;        // assign the value to 0

请让我知道我哪里错了。我不明白A = new int*[n];我只是想用常识来解决这个问题,但我遇到了麻烦。

谢谢!

3 个答案:

答案 0 :(得分:2)

什么是“阵列”?它是一块内存,由地址表示。

如果你想要一个二维数组,那么你需要批次这些数据块 - 你需要知道每个的位置。这意味着您需要一个地址数组,换句话说,需要一个int*数组 - 它会为您提供int**

new int*[n]做的是为地址数组分配内存,在每个地址中,你去放置int数组的地址,通过{{1}分配}。

答案 1 :(得分:2)

您的代码和评论是正确的。为了消除对指针的困惑:

  • 2D数组只是一个数组数组。
  • 为了允许数组具有动态大小(即在编译时未知的大小n),创建指针数组。数组中的每个指针都指向一个int数组。
  • 结果结构与数组数组非常相似 - 它是一个指向数组的指针数组。指针就在那里,因为你不能有例如编译时int a[n][n];,因为大小未知。

这是一个图表:

> [       ]      //">" is a pointer, pointing at an array ([ ])


    [ ]  [ ]  [ ]
> [  ^    ^    ^ ]  // The array is an array of pointers "^", each of which points to an array

答案 2 :(得分:2)

所以你在这里基本上是一个指向数组的指针数组。换句话说,你有一个指针数组,其中数组中的每个指针指向另一个数组。

这是我发现的一张图片:enter image description here

'[]'运算符使您可以使用索引访问数组中的元素。所以A [i]正在访问A数组中的i元素。

 A[i] = new int[n];  

这里你将i的指针放在一个数组中以指向一个新数组。

所以A[i][j] 实际上意味着在A [i] [j]中你正在访问数组中i的元素所指向的j元素。