这可能是一个愚蠢的问题,但是可以将某些值分配给数组而不是全部吗?澄清我想要的东西:
如果我需要像{1,0,0,0,2,0,0,0,3,0,0,0}
这样的数组,我可以创建它:
int array[] = {1,0,0,0,2,0,0,0,3,0,0,0};
此数组的大多数值均为“0”。是否可以跳过此值并仅分配值1,2和3?我想到的是:
int array[12] = {0: 1, 4: 2, 8: 3};
答案 0 :(得分:73)
是否可以跳过此值并仅指定值1,2和3?
在C中,是的。使用指定的初始值设定项(在C99中添加,在C ++中不受支持)。
int array[12] = {[0] = 1, [4] = 2, [8] = 3};
以上初始值设定项将初始化数组0
的元素4
,8
和array
,其值为1
,2
和{{1} } 分别。 Rest元素将使用3
进行初始化。这相当于
0
最好的部分是列出元素的顺序并不重要。也可以像
一样写 int array[12] = {1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0};
但请注意 int array[12] = {[8] = 3, [0] = 1, [4] = 2};
内的表达式应为整数常量表达式。
答案 1 :(得分:13)
这是我琐碎的方法:
int array[12] = {0};
array[0] = 1; array[4] = 2; array[8] = 3;
但是,从技术上讲,这不是“初始化”数组:)
答案 2 :(得分:6)
另一种方法是为数组中的所有元素提供memset
的默认值,然后分配特定元素:
int array[12];
memset(array, 0, sizeof(int) * 12); //if the default value is 0, this may not be needed
array[0] = 1; array[4] = 2; array[8] = 3;
答案 3 :(得分:0)
该标准(C17,N2176)在第6.7.9(37)节中有一个有趣的示例:
示例13 可以使用单个指示符从数组的两端“分配”空间:
int a[MAX] = { 1, 3, 5, 7, 9, [MAX-5] = 8, 6, 4, 2, 0 };
在上面,如果
MAX
大于10,将会有一些 中间的零值元素;如果少于十,一些 前五个初始化器提供的值将被覆盖 到第二五点。
#include <stdio.h>
#define MAX 12
int main(void)
{
// n2176, § 6.7.9(37)
int a[MAX] = {
1, 3, 5, 7, 9, [MAX-5] = 8, 6, 4, 2, 0
};
for (size_t i = 0; i < MAX; i++) {
printf("%d\n", a[i]);
}
return 0;
}
1
3
5
7
9
0 <-- middle element, defaults to zero
0 <-- middle element, defaults to zero
8
6
4
2
0