我尝试使用指向间接二级的附加指针进行三级指针间接寻址。这是一个班级,我有一些实际问题。这就是我正在做的事情。
int ***s = new int **[row];
*s = new int *[row];
**s = new int[row];
现在,如果这些只是int而不是我可以做的数组,
***s = 1;
要将它存储到我的图片上的黄色方块中,但我不知道如何访问数组元素,我尝试了一些事情,它会崩溃或无法编译。任何帮助,甚至指向我正确的方向将是非常有用的。谢谢。
答案 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(通常生活在堆里。)
答案 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
尝试取消引用无效的垃圾指针(通常会崩溃)。