使用以下声明
int array[ROW][COLUMN]={0};
我得到了一个全为零的数组,但是有一个例外:
int array[ROW][COLUMN]={1};
我不理解所有元素都为1的数组。默认值仍然是0。
为什么会这样以及如何初始化为全1?
编辑:我刚明白使用值为1的memset
将每个字节设置为1,因此每个数组单元格的实际值不是1而是16843009
。如何将其设置为1?
使用以下声明
int array[ROW][COLUMN]={0};
我得到了一个全为零的数组,但是有一个例外:
int array[ROW][COLUMN]={1};
我不理解所有元素都为1的数组。默认值仍然是0。
为什么会这样以及如何初始化为全1?
编辑:我刚明白使用值为1的memset
将每个字节设置为1,因此每个数组单元格的实际值不是1而是16843009
。如何将其设置为1?
你会得到这种结果,是因为int array [ROW][COLUMN] = {1};
并不是表示“将所有项目设置为1”。让我逐步解释一下它的工作原理。
初始化数组的明确、过于清晰的方式如下:
#define ROW 2
#define COLUMN 2
int array [ROW][COLUMN] =
{
{0, 0},
{0, 0}
};
然而,在C语言中,允许您省略数组(或struct/union)中的一些项。例如,您可以写成:
int array [ROW][COLUMN] =
{
{1, 2}
};
这意味着,将第一个元素初始化为1,第二个元素初始化为2,其余的元素“好像它们具有静态存储期”。C语言有一条规则,即所有静态存储期对象(未被程序员显式初始化的)必须设置为零。
因此,在上面的例子中,第一行被设置为1,2,下一行被设置为0,0,因为我们没有给它们任何显式值。
接下来,在C语言中允许使用松散的大括号风格。第一个示例也可以写成:
int array [ROW][COLUMN] = {0, 0, 0, 0};
虽然这样写的风格很差,阅读和理解起来更加困难。但这个规则还是很方便的,因为它允许我们编写
int array [ROW][COLUMN] = {0};
这意味着:将第一行中的第一列初始化为0,并将所有其他项视为具有静态存储期,即将它们设置为零。
因此,如果您尝试
int array [ROW][COLUMN] = {1};
它的意思是“将第一行中的第一列初始化为1,将所有其他项目设置为零”。
如果想要将整个数组初始化为特定值/值,请参见https://dev59.com/-2Yr5IYBdhLWcg3wssGP#13488596。
-1
,则可以使用以下方法:memset(array, -1, sizeof(array[0][0]) * row * count)
但这仅适用于0
和-1
0000
和 1111
之外,我不清楚还有什么有用的。 - user1794469<cstring>
头文件。 - mtkint array[ROW][COLUMN]={1};
这将只初始化第一个元素为1,其他所有元素都将被赋值为0。
在第一个例子中,你正在做同样的事情-将第一个元素初始化为0,并将其余默认为0。
原因很简单:对于数组,编译器将使用0来初始化您未指定的每个值。
对于char类型的数组,您可以使用memset函数设置每个字节,但这通常无法用于int类型的数组(虽然对于0是可以的)。一般的for循环可以快速完成此操作:
for (int i = 0; i < ROW; i++)
for (int j = 0; j < COLUMN; j++)
array[i][j] = 1;
或许更快(取决于编译器)
for (int i = 0; i < ROW*COLUMN; i++)
*((int*)a + i) = 1;
0
仅初始化第一个值。然后默认情况下将所有其余值初始化为 0
。 - teppicmemset
将其目标中的每个字节设置为给定的值,这不适用于将int
设置为1。除非您希望将对象的每个字节设置为相同的值,否则不能使用memset
来设置多字节对象的值。 - Eric Postpischil要初始化二维数组为0,请使用以下方法:int arr[n][m] = {};
注意:上述方法仅适用于初始化为0;
clang
也允许使用该扩展(部分原因是为了与GCC兼容性)。该扩展符号允许您使用...
来指定要使用以下值进行初始化的一系列元素。例如:#include <stdio.h>
enum { ROW = 5, COLUMN = 10 };
int array[ROW][COLUMN] = { [0 ... ROW-1] = { [0 ... COLUMN-1] = 1 } };
int main(void)
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COLUMN; j++)
printf("%2d", array[i][j]);
putchar('\n');
}
return 0;
}
输出结果不出所料:
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
0..9
符号表示从0到9的范围,但是C不使用..
作为标记,因此不使用也就不足为奇了。...
符号周围的空格实际上是必须的;如果它们附加到数字上,则将该数字解释为浮点数。例如,0...9
将被标记为0.
、.
、.9
,而浮点数不允许用作数组下标。通过使用命名常量,...ROW-1
不会引起麻烦,但最好养成安全习惯。
补充:
我顺便提一下,GCC 7.3.0 拒绝了以下内容:
int array[ROW][COLUMN] = { [0 ... ROW-1] = { [0 ... COLUMN-1] = { 1 } } };
当在标量初始化器1
周围有额外的一组花括号时(error: braces around scalar initializer [-Werror]
),我不确定这是正确的,因为通常可以在int a = {1};
中指定标量周围的大括号,这是明确被标准允许的。我也不确定它是否不正确。
我还想知道一个更好的符号表示是否为 [0]...[9]
- 这是不含糊的、不会与任何其他有效语法混淆,并避免与浮点数混淆。
int array[ROW][COLUMN] = { [0]...[4] = { [0]...[9] = 1 } };
请使用向量数组:
vector<vector<int>> array(ROW, vector<int>(COLUMN, 1));
char grid[row][col];
memset(grid, ' ', sizeof(grid));
这是将字符数组元素初始化为空格字符的方法。