1

我正在尝试使用三个级别的指针间接以及一个指向第二级间接的附加指针。这是一堂课,我遇到了一些真正的问题。这就是我正在做的事情。

int ***s = new int **[row];
*s = new int *[row];
**s = new int[row];

现在,如果这些只是 int 而不是我可以做的数组,

***s = 1;

要将它存储到我图片上的黄色方块中,但我不知道如何访问数组元素,我尝试了一些方法,它要么崩溃,要么无法编译。任何帮助,甚至指出我正确的方向都会非常有用。谢谢你。

指针图

4

2 回答 2

2

你已经创建了这样的东西(假设row是 2 和 type T):

                           ***
                          +-----+
                          | |
                          +--/--+
                            /
                           /T**
                       +--/--+-----+
                       | | |
                       +-----+--+--+
                       -/ |
                    --/ T* |
                +--/--+-----+ +-+---+------+
                | | | | | |
                +-----+-----+ +--+--+------+
            ----/ -/ | \---
      -----/ --/ T | \--
  +--/--+-----+ +--/--+-----+ +--+--+-----+ +--\--+---- -+
  | | | | X | | | | | | | |
  +-----+-----+ +-----+-----+ +-----+-----+ +-----+---- -+

每个节点都会指向下一级的第一个节点。取消引用每个级别将给出下一个级别,但您还必须注意要到达的数组中元素的索引。我知道,这不是在您的代码中完成的。对于标量,您使用*while 来取消引用数组,除了选择正确的元素之外,数组索引语法也会取消引用。*on 数组只会让你得到第一个元素。

要访问X上图中你会做

T** v = u[0];
T* w = v[1];
T x = w[0];
// shorthand for above
x = u[0][1][0];

要在最后一级有一个数组,你应该这样做

int*** p = new int**;
*p = new int*;
**p = new int[row];

这只会给你 █ → █ → █ → █ █ █ ...,其中p它本身(第一个框)是一个自动变量(通常存储在堆栈空间中),其余来自 freestore(通常位于堆中)。

活生生的例子

于 2015-09-07T04:12:21.200 回答
1

让我们说row = 3这个例子。

int ***s;
// s=[?]
// s is an uninitialized variable.

s = new int **[row];
// s[*] -> [?]
//         [?]
//         [?]
// s points to the first element of an array of size 3.
// The elements are uninitialized.

*s = new int *[row];
// s=[*] -> [*] -> [?]
//          [?]    [?]
//          [?]    [?]
// We've initialized s[0]. It points to another array of size 3.
// All elements of that array are also uninitialized, along with s[1] and s[2].

**s = new int[row];
// s=[*] -> [*] -> [*] -> [?]
//          [?]    [?]    [?]
//          [?]    [?]    [?]
// More of the same. s[0][0] is initialized.
// This last array contains uninitialized ints, not pointers.

***s = 1;
// s=[*] -> [*] -> [*] -> [1]
//          [?]    [?]    [?]
//          [?]    [?]    [?]
// We traverse three levels of pointers (->) and store 1 in the cell.

所有这些都应该可以编译并正常工作(只要您不访问任何未初始化的元素)。


s + 1指向第一个数组的第二个元素。

// s=[*] -> [*] -> [*] -> [1]
// s + 1 -> [?]    [?]    [?]
//          [?]    [?]    [?]

*(s + 1)指上图中[?]所指的单元格。s + 1此单元格未初始化。

**(s + 1)尝试取消引用无效的垃圾指针(并且经常崩溃)。

于 2015-09-07T03:40:02.563 回答