使用单个循环遍历2d数组

时间:2018-03-12 13:12:06

标签: c++ language-lawyer

我有一个定义为double mat[6][6]的二维数组。为了让gcc向量化,我需要使用单个循环。我有以下循环:

double* p = &mat[0][0];
for (int i = 0; i < 36; i++)
     sum += p[i] + 48;

我收到gcc的警告说:数组下标在数组边界之上。为什么呢?

3 个答案:

答案 0 :(得分:2)

不直接回答您的问题,但作为替代方案,您可以使用moddiv来确定各个维度的索引(只要它是二维的),如下所示:

int height = 6;
int width = 6;

for (int i = 0; i < 36; i++)
{
     sum = mat[i / height][i % width] + 48;
}

答案 1 :(得分:0)

没有回答你的问题,但你可以用这种方式解析你的问题:

for(int i=0, j=0; i < 6; (++j < 6) ? (j):(++i,j=0))
{
  sum += mat[i][j] + 48;
}

答案 2 :(得分:0)

最好的选择是使用指针。由于您要使用单个循环,因此需要使用不同的逻辑。 首先发布回答

double* p = &mat[0][0];
for (int i = 0; i < 36; i++)
     sum += *(*(p+ int(i/6)) + i%6)+ 48;

2D数组的指针在以下manner中起作用。考虑int matrix[3][3]

matrix               =>    Points to base address of two-dimensional array.
                           Since array decays to pointer.

*(matrix)            =>    Points to first row of two-dimensional array.
*(matrix + 0)        =>    Points to first row of two-dimensional array.
*(matrix + 1)        =>    Points to second row of two-dimensional array.

**matrix             =>    Points to matrix[0][0]
*(*(matrix + 0))     =>    Points to matrix[0][0]
*(*(matrix + 0) + 0) =>    Points to matrix[0][0]
*(*matrix + 1)       =>    Points to matrix[0][1]
*(*(matrix + 0) + 1) =>    Points to matrix[0][1]
*(*(matrix + 2) + 2) =>    Points to matrix[2][2]

所以代码的工作原理如下:

*(*(p+ int(i/6)) + i%6)上的

i=0提供了*(*(p+ 0) + 0)

*(*(p+ int(i/6)) + i%6)上的

i=1提供了*(*(p+ 0) + 1)

*(*(p+ int(i/6)) + i%6)上的

i=2提供了*(*(p+ 0) + 2)

并且循环上升到i=35