将数组的所有元素初始化为0

3

在 C 语言中,我创建了一个二维数组,其中所有元素都是零。

我是用以下方法实现的:

int a[5][5],i,j;  //a is the required array
for(i=0;i<5;i++)
   for(j=0;j<5;j++)
       a[i][j]=0;

我知道另外一种方法:

我知道其他的方式:

int a[5][5]={0};

这两者是一样的吗?还是有区别?应该选择哪一个?谢谢!

3
此问题可能与如何在C语言中初始化数组重复。 - Sam
1
请注意,后一种方法(使用视图初始化程序然后元素)仅适用于0 - alk
4个回答

6

两种方法都有相同的效果,但第二种方法通常会更快,因为它允许编译器优化和矢量化该代码。

另一种广泛接受的方法(也可优化)是:

memset(a, 0, sizeof(a));

2
不要忘记取地址符号(&)来获取一个变量的地址(&a)。 - Fiddling Bits
@BitFiddlingCodeMonkey 当 a 被声明为数组时,在 C 中 a&a 具有相同的含义。 - Sergey L.
2
@SergeyL;不,这并不是真的。虽然它们的值相同,但含义不同。 - haccks
其实,@SergeyL 你可能是对的。a == a[0] == &a[0][0],对吧? - Fiddling Bits
1
@BitFiddlingCodeMonkey 是的,我指的是值。类型可能不同,但值是相同的——数组的开头=第一个元素的地址。 - Sergey L.

6
第二种方法更为简洁。此外,还要考虑以下几点:
memset(&a, 0, sizeof(a));

3

第二个比较有用。 第一个使用for循环,所以速度较慢。 还有其他初始化数组的方法...

int myArray[10] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }; // All elements of myArray are 5
int myArray[10] = { 0 };    // Will initialize all elements to 0
int myArray[10] = { 5 };    // Will initialize myArray[0] to 5 and other elements to 0
static int myArray[10]; // Will initialize all elements to 0
/************************************************************************************/
int myArray[10];// This will declare and define (allocate memory) but won’t initialize
int i;  // Loop variable
for (i = 0; i < 10; ++i) // Using for loop we are initializing
{
    myArray[i] = 5;
}
/************************************************************************************/
int myArray[10] = {[0 ... 9] = 5}; // This works in GCC
memset(myArray, 0, sizeof(myArray));

[0 ... 9] = 5 在其他编译器中也是有效的。这在使用 -std=gnu99clangicc 中对我很有用。 - Sergey L.

0

如果我不想过度紧张我的眼睛(和编译器),我更喜欢后者。


你如何过度压力编译器? - wjmolina
1
回答问题,如果你能启发我,我会取消我的负评。 - wjmolina
1
一个智能编译器将把第一个示例转换为第二个示例。haccks试图有点不敬,但他的观点是最终目标代码可能看起来相同。如果我不想过度强调自己,我更喜欢后者。 :) - Mark Lakata
@MarkLakata;我现在的投票次数已经用完了,否则我会给你的评论点赞。关于你说的“haccks试图有点不敬”,我认为我是尊重的!如果我的回答是:“如果你不想过度强调编译器,那么你应该选择后者”,那就是不敬了 :) - haccks
1
@JosuéMolina; 我编辑了我的回答。 - haccks
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接