C++ 使用单个循环在二维阵列上循环

C++ 使用单个循环在二维阵列上循环,c++,language-lawyer,C++,Language Lawyer,我有一个定义为双垫[6][6]的二维数组。为了让gcc矢量化for,我需要使用一个循环。我有以下循环: double* p = &mat[0][0]; for (int i = 0; i < 36; i++) sum += p[i] + 48; double*p=&mat[0][0]; 对于(int i=0;i

我有一个定义为
双垫[6][6]
的二维数组。为了让gcc矢量化for,我需要使用一个循环。我有以下循环:

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

gcc警告我:数组下标高于数组边界。为什么?

没有直接回答您的问题,但作为替代方案,您可以使用
mod
div
确定各个维度的索引(只要是二维的):

int height = 6;
int width = 6;

for (int i = 0; i < 36; i++)
{
     sum = mat[i / height][i % width] + 48;
}
int高度=6;
整数宽度=6;
对于(int i=0;i<36;i++)
{
总和=材料[i/高度][i%宽度]+48;
}

不回答您的问题,但您可以通过以下方式解析mat:

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

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

因此代码的工作原理如下所示:

*(*(p+int(i/6))+i%6)
on
i=0
给出了
*(*(p+0)+0)

*(*(p+int(i/6))+i%6)
on
i=1
给出了
*(*(p+0)+1)

*(*(p+int(i/6))+i%6)
on
i=2
给出了
*(*(p+0)+2)


循环上升到
i=35

是的,当然,但我正试图减少对
mat double[outer][inner]
的操作,应该是
mat[i/inner][i%inner]
注意
//code>和
%
的操作非常昂贵,即使你使用一个奇特的函数将它们组合在一起。重复?上周只有一个回答说这是UB,并有一些很好的标准引用。我现在正试图找到它。对于类似的情况,我曾经使用过
union{double mat[4][4];double value[16];}(可能是,一些<代码> Advestor()/代码> s让我睡得更好。)GryWordF82:虽然这也是UB,但在C++中,不能通过<代码>联合<代码>键入双关语。最简单和最健壮的解决方案可能是坚持一维数组来存储。2D访问可以通过一个执行div/mod的小函数来完成。(或封装在类中以粘合在一起。)
double* p = &mat[0][0];
for (int i = 0; i < 36; i++)
     sum += *(*(p+ int(i/6)) + i%6)+ 48;
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]