什么是C中指定的初始值设定项?

什么是C中指定的初始值设定项?,c,struct,union,initializer,designated-initializer,C,Struct,Union,Initializer,Designated Initializer,我知道这可能是一个基本问题 我有一个赋值要求我理解C中指定的初始值设定项是什么,以及用一个初始化变量意味着什么 我不熟悉这个术语,也找不到任何结论性的定义 什么是C中的指定初始值设定项?指定初始值设定项有两种味道: 1) 它提供了一种快速初始化数组中特定元素的方法: int foo[10] = { [3] = 1, [5] = 2 }; 将所有元素设置为foo为0,索引3将设置为1,索引5将设置为2 2) 它提供了一种显式初始化struct成员的方法。比如说, struct Foo { int

我知道这可能是一个基本问题

我有一个赋值要求我理解C中指定的初始值设定项是什么,以及用一个初始化变量意味着什么

我不熟悉这个术语,也找不到任何结论性的定义


什么是C中的指定初始值设定项?指定初始值设定项有两种味道:

1) 它提供了一种快速初始化数组中特定元素的方法:

int foo[10] = { [3] = 1, [5] = 2 };
将所有元素设置为
foo
为0,索引3将设置为1,索引5将设置为2

2) 它提供了一种显式初始化
struct
成员的方法。比如说,

struct Foo { int a, b; };
你可以写

struct Foo foo { .a = 1, .b = 2 };
请注意,在这种情况下,未显式初始化的成员将被初始化,就像实例具有
static
duration一样



两个都是标准C,但是注意C++也不支持(因为构造函数可以用那个语言来做。)< /P> < P>自从ISC99以来,设计的初始化器出现了,在初始化代码<结构> <代码>、<代码>联合< /COD>或<代码>数组 >时,初始化C是一种不同的、更动态的初始化方式。 与标准初始化的最大区别在于,不必按固定顺序声明元素,也可以省略元素

从:

标准C90要求初始值设定项的元素以固定顺序出现,与正在初始化的数组或结构中元素的顺序相同

在ISOC99中,您可以按随机顺序给出元素,指定它们所应用的数组索引或结构字段名,GNUC也允许将其作为C90模式的扩展


例子 1.数组索引 标准初始化

inta[6]={0,0,15,0,29,0};
设计初始化

inta[6]={[4]=29[2]=15};//或
int a[6]={[4]29[2]15};//或
整数宽度[]={[0…9]=1,[10…99]=2,[100]=3};
2.结构或联合: 标准初始化

结构点{intx,y;}; 设计初始化

结构点p={.y=2.x=3};或 结构点p={y:2,x:3}; 3.将命名元素与后续元素的普通C初始化相结合: 标准初始化

inta[6]={0,v1,v2,0,v4,0};
设计初始化

inta[6]={[1]=v1、v2、[4]=v4};
4.其他: 标记数组初始值设定项的元素

int空格[256]={[']=1,['\t']=1,['\h']=1,
['\f']=1,['\n']=1,['\r']=1};
在“=”之前写入一系列“.fieldname”和“[index]”指示符,以指定要初始化的嵌套子对象

struct point ptarray[10]={[2].y=yv2[2].x=xv2[0].x=xv0};

向导

看这里,我投票结束这个问题,因为没有进行认真的研究。@chux否定,但我正在寻找一个副本,但找不到,只有一些显示如何初始化数组或结构,但两者都不是。@chux-SO应该是相关问题的高质量答案库,对吗?碰巧,今天我有了这个问题,很高兴在一个我可以信任的地方找到芭丝谢芭简洁的答案。(是的,我应该有我自己的C11标准,但是唉,我不知道。而且,标准并不是凡人都能找到答案的最佳地方,所以Q和A在这里看起来是完全合适的。)只是看杰森在C++每周频道上解释它,看一看关于C++的进一步阅读。我相信它已经为下一个标准做好了准备。@AnttiHaapala:需要挖掘出我的标准,以便在规则线之前发表最后评论。(唉,我在唧唧唧唧上)。我认为这是正确的。至少未初始化未命名的结构成员。未在代码中显式初始化的(变量的)成员将由编译器自动初始化为0。与所有静态和全局变量非常相似,在代码中未显式完成时,它们总是自动初始化为0。