堆栈和堆上的c ++多维数组布局

时间:2014-09-16 21:59:14

标签: c++ multidimensional-array

堆栈上的

string array3d1[x][y][z];
据我所知,在堆栈内部,它实际上是一维数组。

堆上的

string * * * array3d2;
array3d2 = new string * * [x];
for (int i = 0; i < x; i++)
{
    array3d2[i] = new string * [y];
    for (int j = 0; j < y; j++)
    {
        array3d2[i][j] = new string [z];
    }
}

在堆上它的数组数组。

问题:

(1)array3d1 [a] [b] [c]的索引是什么?

(2)当我使用以下语法访问array3d1和array3d2时:

array3d1[a][b][c];

array3d2[a][b][c];

编译器如何知道正确的访问元素,因为它们处于不同的布局中?

1 个答案:

答案 0 :(得分:1)

  1. array3d1 [a] [b] [c]的索引是什么?

    如果您的意思是&array3d1[a][b][c] - (string*)array3d1的价值是什么,则它等于a*y*z + b*z + c

  2. 编译器如何知道要访问的正确元素,因为它们处于不同的布局中?

    编译器知道,因为array3d1array3d2有不同的类型。

    array3d1的类型为array of size x of arrays of size y of arrays of size z of string,因此array3d1[a]的类型为array of size y of arrays of size z of string,位于原始数组的a索引处,即{{1} }} a*y*z从一开始。等应用其他指数。

    string*的类型为array3d2,索引也相应完成。