c ++中2D数组的内存分配

时间:2016-12-15 06:25:03

标签: c++ arrays

我是c ++的新手,并试图了解如何为2D数组完成内存分配。我已经在SOF和这些答案中经历了几个线程。

answer1

answer2

这些答案表明,对于2D阵列以及普通阵列,连续的内存分配也会发生。 (如果我错了,请纠正我)答案2提到它应该能够使用super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

访问array[i][j]元素

但是,当我试图这样做时,它会给我一个意想不到的结果。

代码:

*(array + (i * ROW_SIZE) + j)

结果:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    int array[2][2] = { {1, 2}, {3, 4} };
    cout<<*((array+1*2) + 1)<<endl;  
    cout<<**((array+1*2) + 1)<<endl;  
    return 0;
}

它没有给我0x76e1f4799008 2012576581 个元素。有人可以解释这里发生的事情,这个解决方案是错误还是我误解了以前的答案。

3 个答案:

答案 0 :(得分:3)

更像是将2d数组模拟为像这样的一维数组

0 1 2
3 4 5
6 7 8

并且数组将为0 1 2 3 4 5 6 7 8访问4它应该是*(a [0] +(1 * 3)+1)a [0]与a(名称相同)数组)。

答案 1 :(得分:3)

首先,您必须获得指向整个事物的第一个元素的指针,即不仅仅是第一行:

int *p = &array[0][0]

之后,您可以按照自己的意愿索引p

std::cout << *(p + 1*2 + 1) << std::endl;

您的初始尝试不起作用的原因与类型有关。发生的事情是,在您第一次尝试时,您正在尝试评估

*(array + 1*2 + 1)

现在,array的类型为“array-of-length-2”,包含“array-of-length-2”,其中包含int s,即(int[2])[2] do是array的增量,其大小是其元素的3倍,而后者又是int[2]这将超出您的数组。实际上*(array+3)相当于array[3]。现在,这显然属于类型int[2],当您尝试打印时,它将衰减为指针。在你的第二次尝试中,你取消引用它,产生类似array[3][0]的东西,它现在是正确的类型,但同样,在数组之外的点。

答案 2 :(得分:1)

数组是2D指针

**array = array[0][0]
*(*array + j) = array[0][j]
*(*(array+i) + j) = array[i][j]