我是c ++的新手,并试图了解如何为2D数组完成内存分配。我已经在SOF和这些答案中经历了几个线程。
这些答案表明,对于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
个元素。有人可以解释这里发生的事情,这个解决方案是错误还是我误解了以前的答案。
答案 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]