使用数组

时间:2015-09-07 03:27:52

标签: c++ arrays pointers dynamic indirection

我尝试使用指向间接二级的附加指针进行三级指针间接寻址。这是一个班级,我有一些实际问题。这就是我正在做的事情。

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

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

***s = 1;

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

pointer diagram

2 个答案:

答案 0 :(得分:2)

您已经创建了这样的内容(假设row为2并且输入T):

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

每个节点都指向下一个级别的第一个节点。取消引用每个级别将提供下一级别,但您还要处理要访问的数组中元素的索引。我认为,这不是在您的代码中完成的。对于使用*取消引用的标量,而对于数组,数组索引语法除了选择正确的元素之外还会解除引用。数组上的*只会让你第一个元素。

要访问上图中的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(通常生活在堆里。)

Live example

答案 1 :(得分:1)

对于这个例子,我们说UIViewController

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尝试取消引用无效的垃圾指针(通常会崩溃)。