代码之家  ›  专栏  ›  技术社区  ›  Maverick

“新国际”是做什么的?

  •  3
  • Maverick  · 技术社区  · 6 年前

    我在某个地方看到了下面的代码,我有点困惑。

    int****            m_ppppCoder;
    m_ppppCoder = new int ***[10];
    

    这是一个动态分配的三维int数组吗?有人能确切地解释一下,它是如何工作的吗?

    阅读评论后增加: 上面的声明本身不是一个完整的3d int数组,而是数组创建的第一步的声明结构。根据这一点,使用下面的代码,您可以动态创建一个3d数组。是这样吗?

    m_ppppCoder[0] = new int **[10];
    m_ppppCoder[0][0] = new int *[10];
    m_ppppCoder[0][0][0] = new int[10];
    

    在这种情况下,实际的数据是如何在内存ie中按顺序排列(分配)的?

    1 回复  |  直到 6 年前
        1
  •  9
  •   eerorika    6 年前

    这是一个动态分配的三维int数组吗?

    不。

    int****            m_ppppCoder
    

    m_ppppCoder 是指向指向指向整数的指针的指针。

    m_ppppCoder = new int * **[10];
    

    m_ppcoder公司 指向由10个指针组成的动态分配数组的第一个元素,该数组指向指向整数指针的指针。

    有人能确切地解释一下,它是如何工作的吗?

    好吧,它是指向数组元素的指针,所以它本身不会做很多工作。用法示例:

    int i = 42;                 // an integer i
    int *ii = &i;               // ii points to i
    int **iii = ⅈ            // iii points to ii
    m_ppppCoder[0] = &iii;      // the first element points to iii
    int j = ****m_ppppCoder[0]; // the value of j is now 42
    delete[] m_ppppCoder;       // never forget to delete dynamic memory
    

    对于 int**** .


    m_ppppCoder = new int ***[10];
    m_ppppCoder[0] = new int **[10];
    m_ppppCoder[0][0] = new int *[10];
    m_ppppCoder[0][0][0] = new int[10];
    

    在这种情况下,实际的数据是如何在内存ie中按顺序排列(分配)的?

    这样地:

    pointer to int***     p
                          |
    an array of 10 int*** |->[0][1][2][3]...
                              |
    an array of 10 int**      |->[0][1][2][3]...
                                  |
    an array of 10 int*           |-> [0][1][2][3]...
                                       |
    an array of 10 int                 |-> [0][1][2][3]...
    

    很简单。您已经分配了4个阵列。因为它们是独立的分配,所以这4个数组中的每一个都是独立的,位于免费存储区的某个地方。

    数组元素本身在内存中是连续的。因此,每个指针(或最后一个指针的整数)在内存中相对于同一数组的其他元素是连续的。

    请注意 m_ppppCoder[x] , m_ppppCoder[0][x] m_ppppCoder[0][0][x] 是[1,10]中所有x的未初始化指针。