C 初始化结构数组

C 初始化结构数组,c,arrays,struct,initialization,C,Arrays,Struct,Initialization,这是我在别人的问题中发现的初始化。 my_data data[]={ { .name = "Peter" }, { .name = "James" }, { .name = "John" }, { .name = "Mike" } }; 我以前从未见过这样的东西,也找不到解释。名称如何可能是正确的。 我想知道的是这个过程是如何一步一步地进行的 看起来它得到了: 1) data; 2) *data; 3) (*data).name; 4) (*data).name

这是我在别人的问题中发现的初始化。

my_data data[]={
    { .name = "Peter" },
    { .name = "James" },
    { .name = "John" },
    { .name = "Mike" }
};
我以前从未见过这样的东西,也找不到解释。名称如何可能是正确的。
我想知道的是这个过程是如何一步一步地进行的

看起来它得到了:

1) data;
2) *data;
3) (*data).name;
4) (*data).name="Peter";
还是我完全错了?

这很简单:
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_数据结构,以至于每个类型成员都有一个名为Peter、James、John和Mike的结构。

它被称为指定初始值设定项,这是在C99中引入的。它用于初始化
struct
或数组,在本例中为
struct

给定

下面的初始化

struct point p = { .y = 2, .x = 1 };
struct point p = { .y = yvalue, .x = xvalue };
相当于C89样式

struct point p = { 1, 2 };

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

这里只有两个语法在起作用

  • 普通旧数组初始化:

    int x[] = {0, 0}; // x[0] = 0, x[1] = 0
    
  • 指定的初始化器。请参阅此问题的公认答案:

    不过,语法是非常不言自明的。您可以这样初始化:

    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[]
    是结构的一部分,您正在初始化每个索引。阅读如下:

    my_data data[] = {
        [3].name = "Mike",
        [2].age = 40,
        [1].name = "James",
        [3].age = 23,
        [0].name = "Peter",
        [2].name = "John"
    }; 
    
    : 在结构初始值设定项中,在元素值之前指定要初始化的字段的名称。例如,给定以下结构

    struct point { int x, y; };
    
    下面的初始化

    struct point p = { .y = 2, .x = 1 };
    
    struct point p = { .y = yvalue, .x = xvalue };
    
    相当于

    struct point p = { xvalue, yvalue };
    
    另一个具有相同含义的语法是
    fieldname:'
    ,自GCC 2.5以来已过时,如下所示:

    struct point p = { y: yvalue, x: xvalue };
    
    你也可以写:

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

    或:

    第二种和第三种形式可能很方便,因为您不需要按顺序书写。例如,上述所有示例都相当于:

    my_data data[] = {
        [3].name = "Mike",
        [1].name = "James",
        [0].name = "Peter",
        [2].name = "John"
    }; 
    
    如果结构中有多个字段(例如,
    int age
    ),则可以使用以下命令一次性初始化所有字段:

    my_data data[] = {
        [3].name = "Mike",
        [2].age = 40,
        [1].name = "James",
        [3].age = 23,
        [0].name = "Peter",
        [2].name = "John"
    }; 
    
    要了解数组初始化,请阅读

    此外,您可能还想阅读@关于开关箱的答案:

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

    指定的初始值设定项允许您为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" }
    };
    
    只是一种更紧凑的

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

    我希望你知道后者的功能。

    它只是C99,在过去14年中一直是C标准。一步一步?您必须熟悉
    inta[2]={0,0}
    语法。所以你唯一不知道的是
    {.name=“foo”}
    ,这对我来说似乎是不言自明的@PaulR,目前的C标准是C11…@Jens:很好-评论更新!这对我来说很有价值,因为我想知道如何在不失去理智的情况下初始化一个结构数组structs@jangorecki我分解了问题;第一个示例是关于数组初始化的,第二个示例是关于结构初始化的。把两者结合起来,你就可以看到OP发布的语法是如何初始化一个结构数组的,这就是这里的问题。是的,但是“将两者结合起来”实际上是很难实现的。。。无论如何,在我所见过的许多答案中,你的回答对我来说是最有用的。将在可能的情况下删除否决票。