初始化结构数组

这是我刚刚在其他人的问题中找到的初始化。

my_data data[]={ { .name = "Peter" }, { .name = "James" }, { .name = "John" }, { .name = "Mike" } }; 

我之前从未见过这样的东西,也找不到解释.name可能是正确的。
我正在寻找的是这个过程如何逐步进行。

它看起来像是:

 1) data; 2) *data; 3) (*data).name; 4) (*data).name="Peter"; 

还是我完全错了?

这里只有两种语法。

  1. 普通旧arrays初始化:

     int x[] = {0, 0}; // x[0] = 0, x[1] = 0 
  2. 指定的初始化程序 。 请参阅此问题的已接受答案: 如何根据C编程语言标准初始化结构

    但语法很明显。 你可以像这样初始化:

     struct X { int a; int b; } struct X foo = { 0, 1 }; // a = 0, b = 1 

    或使用任何订购,

     struct X foo = { .b = 0, .a = 1 }; // a = 1, b = 0 

my_data是一个结构,其name为字段, data[]是结构的结构,您正在初始化每个索引。 阅读以下内容

5.20指定的初始化器 :

在结构初始值设定项中,指定要在元素值之前使用.fieldname ='初始化的字段的名称。 例如,给定以下结构,

  struct point { int x, y; }; 

以下初始化

  struct point p = { .y = yvalue, .x = xvalue }; 

相当于

  struct point p = { xvalue, yvalue }; 

另一种具有相同含义的语法,自GCC 2.5以来已经过时,是fieldname:' ,如下所示:

  struct point p = { y: yvalue, x: xvalue }; 

你也可以这样写:

 my_data data[]={ { .name = "Peter" }, { .name = "James" }, { .name = "John" }, { .name = "Mike" } }; 

如:

 my_data data[]={ { [0].name = "Peter" }, { [1].name = "James" }, { [2].name = "John" }, { [3].name = "Mike" } }; 

第二种forms可能很方便,因为您不需要按顺序编写,例如上面的内容相当于:

 my_data data[]={ { [3].name = "Mike" }, { [1].name = "James" }, { [0].name = "Peter" }, { [2].name = "John" } }; 

要理解数组初始化读取Strange初始化表达式?
另外,您还可以阅读@ Shafik Yaghmour关于开关案例的答案: C代码中switch-case中的“…”是什么

这里没有“一步一步”。 当使用常量表达式执行初始化时,该过程基本上在编译时执行。 当然,如果数组被声明为本地对象,它将在本地分配并在运行时进行初始化,但仍然可以将其视为无法进行有意义细分的单步过程。

指定的初始值设定项允许您为struct对象的特定成员(或数组的特定元素)提供初始值设定项。 所有其他成员都进行了零初始化。 所以,如果my_data被声明为

 typedef struct my_data { int a; const char *name; double x; } my_data; 

然后你的

 my_data data[]={ { .name = "Peter" }, { .name = "James" }, { .name = "John" }, { .name = "Mike" } }; 

只是一种更紧凑的forms

 my_data data[4]={ { 0, "Peter", 0 }, { 0, "James", 0 }, { 0, "John", 0 }, { 0, "Mike", 0 } }; 

我希望你知道后者的作用。

它被称为指定初始化程序 ,它在C99中引入。 它用于初始化struct或数组,在本例中为struct

特定

 struct point { int x, y; }; 

以下初始化

 struct point p = { .y = 2, .x = 1 }; 

相当于C89风格

 struct point p = { 1, 2 }; 

这很简单: my_data是一个之前定义的结构类型。 所以你想声明一些元素的my_data ,就像你一样

 char a[] = { 'a', 'b', 'c', 'd' }; 

因此,数组将有4个元素,并将它们初始化为

 a[0] = 'a', a[1] = 'b', a[1] = 'c', a[1] ='d'; 

这称为指定的初始化程序(我记得正确)。

它只是表明数据必须是my_dat类型,并且必须是一个需要存储这么多my_data结构的数组,结构中每个类型的成员名称为Peter,James,John和Mike。

它是一个指定的初始化器 ,引入了C99标准; 它允许您按名称初始化结构或联合对象的特定成员。 my_data显然是struct类型的typedef,其成员name类型为char *char [N]