在C中初始化“眼睛”(标识)矩阵数组

时间:2013-05-13 18:40:58

标签: c

int eye[3][3] = {
  { 1,0,0 },
  { 0,1,0 },
  { 0,0,1 }
};

是否有更短的初始化方法?它是如此规律,必须有一种更聪明的方式来初始化它,特别是如果它超过3x3,比如10x10或更多。

4 个答案:

答案 0 :(得分:9)

中你可以写:

int eye[][3] = { [0][0] = 1, [1][1] = 1, [2][2] = 1 };

所有其他元素都归零,此外编译器会为您计算出数组的大小。只是不要跳过第二个尺寸(3)。

顺便说一下。在您的代码中,您不必使用双括号,这也没关系:

int eye[3][3] = {
  1,0,0,
  0,1,0,
  1,0,1,
};

中你也可以留下尾随逗号,只是为了对称和未来的重构

其他解决方案可能需要您编写一些代码,这可能确实可以节省您在文件中的一些时间/空间。但请注意,这种方式是分裂声明和“初始化”,例如,全局变量可以有所作为。

答案 1 :(得分:6)

您可以使用designated initializers

int eye[3][3] = { [0][0]=1, [1][1]=1, [2][2]=1};

根据C标准的保证,所有其他元素将被初始化为0.

答案 2 :(得分:4)

您可以尝试以下方法:

#define SIZE 3
int eye[SIZE][SIZE] = {0};

for (int i = 0; i < SIZE ; ++i)
{
  eye[i][i] = 1;
}

答案 3 :(得分:1)

如果你想用方形矩阵的方式存储{{ 1,0,0 }, { 0,1,0 }, ...}这种值,你可以写一个简单的逻辑如下。

#define SIZE 3
int eye[SIZE][SIZE] = {0};
int *p = (int *)eye;

for (i = 0; i < (SIZE * SIZE); i = i + (SIZE + 1))
{
    p[i] = 1;   
}

for (i = 0; i < SIZE; i++)
{
    for (j = 0; j < SIZE; j++)
    {
        if (i == j)
        {
            eye[i][j] = 1;          
        }
        else
        {
            eye[i][j] = 0;
        }
    }
}

注意:以上逻辑仅适用于您给出的样本值。因此,如果您的值具有某种关系,请尝试找到类似的逻辑。如果不是这样,那么即使矩阵的大小为1000x1000,也没有其他方法可以直接初始化它。