3

我知道这个问题可能以前被问过,但在这种情况下我不明白:

这是我要检查的代码,我会评论它。请让我知道我错在哪里

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];我只是想用常识来弄清楚,但我遇到了麻烦。

谢谢!

4

3 回答 3

2

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

这是我发现的一张图片来说明这一点: 在此处输入图像描述

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

 A[i] = new int[n];  

在这里,您使数组中的 i 指针指向一个新数组。

因此,A[i][j]
实际上意味着在 A[i][j] 中,您正在访问 A 中的 i 元素指向的数组中的 j 元素。

于 2013-07-31T04:40:19.140 回答
2

什么是“数组”?它是一块内存,由它的地址表示。

如果你想要一个二维数组,那么你需要很多这样的块——你需要知道每个块的位置。这意味着您需要一个地址数组,或者换句话说,一个数组int*- 给您一个int**.

它的作用是new int*[n]为一个地址数组分配内存,在每个地址中,你去放置一个 s 数组的地址int,通过new int[n].

于 2013-07-31T04:27:21.333 回答
2

您的代码和注释是正确的。为了消除关于指针的混淆:

  • 二维数组只是数组的数组。
  • 为了允许数组具有动态大小(即n在编译时大小未知),创建了一个指针数组。数组本身中的每个指针都指向一个整数数组。
  • 生成的结构与数组数组非常相似——它是指向数组的指针数组。指针在那里只是因为你不能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
于 2013-07-31T04:28:10.200 回答