指向指针的指针如何对应二维数组?

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]; 一无所知,只是想通过常识弄清楚,但遇到麻烦了。
谢谢!

你在评论中描述的是正确的。哪里出了问题?你是在尝试使用双指针而期望的是真正的二维数组吗? - user529758
它正在工作。我只是不明白两个指针(一个指向另一个)如何对应于二维数据结构...我需要一个图表或其他东西。 - Oleksiy
首先索引是行索引(它是一个指向行起始地址的指针数组),第二个索引则是该行中列的索引。 - user529758
3个回答

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
一个二维数组就是一个数组的数组。需要强调的是,因此,OP没有一个二维数组。 - user529758
所以,总结一下,在我的情况下,A是一个指向指针数组的数组的指针?这正确吗? - Oleksiy
1
@H2CO3:从逻辑上讲,他是这样的。只是它恰好不符合C术语。 - user541686
@Mehrdad 嗯,我们可以争论一下。如果你认为自己有能力和资格覆盖C(++)术语,那就去做吧 :) - user529758
@maditya 谢谢!现在一切都清楚了。 - Oleksiy
显示剩余2条评论

2
基本上,你这里有一个指向数组的指针数组。换句话说,你有一个指针数组,其中数组中的每个指针都指向另一个数组。
这是一张我找到的图片,用来说明这个概念:enter image description here '[]' 运算符可以让你使用索引访问数组中的元素。所以 A[i] 就是访问 A 数组中第 i 个元素。
 A[i] = new int[n];  

在这里,你将i在数组中的指针指向一个新的数组。
因此,A[i][j]实际上意味着在A[i]所指向的数组中访问第j个元素。

2

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

如果你想要一个二维数组,那么你需要 很多 这样的块 - 而且你需要知道它们中的 每一个 的位置。这意味着你需要一个地址数组,换句话说,一个 int* 类型的数组,这将给你一个 int** 类型的数组。

new int*[n] 做的是分配一块内存用于一个地址数组,然后在其中的每个地址中,你可以放置一个通过 new int[n] 分配的 int 数组的地址。


1
嗯,“多维数组”一词通常指声明为 T arr[rows][cols]; 的数组。它们与指向指针的指针不同。 - user529758
@H2CO3:嗯,单维数组也不同于指针,但知道这一点并不能帮助OP理解基本的情况。 - user541686

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接