我有一个问题。我正在用C ++编写一个简单的应用程序,我有以下问题: 我想使用二维数组来指定对象的位置(x和y坐标)。但是当我创建这样一个数组时,当我访问它时,我遇到了许多访问冲突问题。我不太确定,那些违规行为来自哪里,但我认为,我的堆栈不够大而且我使用指针。但是当我搜索一个在堆中使用多维数组的解决方案并指向它时,解决方案对我来说太复杂了。
所以我记得有一种方法可以将“普通”一维数组用作多维数组。但我不记得确切,我如何以正确的方式访问它。我这样宣布:
char array [SCREEN_HEIGHT * SCREEN_WIDTH];
然后我试着用这种方式填写:
for(int y = 0; y < SCREEN_HEIGHT; y++) {
for(int x = 0; x < SCREEN_WIDTH; x++) {
array [y + x * y] = ' ';
}
}
但这不对,因为位于y + x * y位置的char未完全指定(因为y + y * x指向相同位置) 但我很确定,有办法做到这一点。也许我错了,所以告诉我:D 在这种情况下,使用多维数组的解决方案会很棒!
答案 0 :(得分:8)
你不想要y + x*y
,你想要y * SCREEN_WIDTH + x
。也就是说,一个2D数组声明为:
char array[SCREEN_HEIGHT][SCREEN_WIDTH];
具有完全相同的内存布局,您可以直接以您希望的方式访问它:
array[y][x] = ' ';
答案 1 :(得分:1)
char array2D[ROW_COUNT][COL_COUNT] = { {...} };
char array1D[ROW_COUNT * COL_COUNT];
for (int row = 0; row < ROW_COUNT; row++)
{
for (int col = 0; col < COL_COUNT; col++)
{
array1D[row * COL_COUNT + col] = array2D[row][col];
}
}
您可以通过&#34;当前行*总列数+当前列&#34;来访问1D数组的正确元素。反之亦然,如果您首先循环遍历列。