gpt4 book ai didi

c - C 中的结构体初始化和打印

转载 作者:行者123 更新时间:2023-11-30 19:03:45 25 4
gpt4 key购买 nike

我正在解决涉及下面代码的问题,我有点迷失了。“class[]”在做什么,这如何改变我打印成员的方式?我以前从未见过这样的初始化。

int main(){    
struct Student {
char Initials2[2];
int id;
struct Student *teammate;
};
typedef struct Student SType;
#define XYpt &class[0]
#define ABpt &class[1]
#define RSpt &class[2]
#define CDpt &class[3]
#define JVpt &class[4]
#define RYpt &class[5]
SType class[6] = {
{{'X','Y'},123, RSpt},
{{'A','B'},23, RYpt},
{{'R','S'},11, XYpt},
{{'C','D'},44, JVpt},
{{'J','V'},42, CDpt},
{{'R','Y'},457, ABpt}
};

return 0;
}

最佳答案

代码的作用:

  • struct Student 有点特殊,因为它包含一个指向相同类型 struct Student *teammate 的对象的指针。这可以通过使用指向带有“结构标记”Student 的对象的指针来实现,该指针充当前向声明的一种形式。

  • typedef struct Student SType; 只是隐藏了 struct 关键字,这是一个编码风格问题。像这样编写整个内容会更清晰:

    typedef struct Student {    
    char Initials2[2];
    int id;
    struct Student *teammate;
    } SType;
  • SType class[6] = { {{'X','Y'},123, RSpt}, .... 只是一个包含 6 个结构体的数组,每个结构体都已初始化。这组宏扩展到名为“class”的同一数组的变量地址。这是糟糕的风格 - 程序员使用这种肮脏的方式来“命名”数组中的每个项目。后缀“pt”似乎意味着指针。

<小时/>

代码是如何编写的:

可以通过使用 union 将数组的每个项目与标识符关联起来,而不是使用难看的宏。例如:

typedef union
{
struct foo
{
int foo;
int bar;
} foo;
int array [2];
} foobar;

这里,对象foobar fb;可以通过fb.foo.foofb.array[0]来访问,这意味着数组的相同项 0。使用现代标准 C,我们可以删除内部结构名称(匿名结构)并仅以 fb.foo 形式访问对象。

此外,它还可以与指定的初始化程序结合使用,以按名称初始化结构体的某些命名成员:foobar fb { .foo = 1, .bar = 2 };.

使用 union 、匿名结构和指定的初始化器重写您的示例,我们得到以下结果:

typedef struct student {    
char initials [2];
int id;
struct student *teammate;
} s_type;

typedef union
{
struct
{
s_type XY;
s_type AB;
s_type RS;
s_type CD;
s_type JV;
s_type RY;
};
s_type array [6];
} class_t;

class_t class =
{
.XY = { .initials={'X','Y'}, .id=123, .teammate = &class.RS},
.AB = { .initials={'A','B'}, .id= 23, .teammate = &class.RY},
.RS = { .initials={'R','S'}, .id= 11, .teammate = &class.XY},
.CD = { .initials={'C','D'}, .id= 44, .teammate = &class.JV},
.JV = { .initials={'J','V'}, .id= 42, .teammate = &class.CD},
.RY = { .initials={'R','Y'}, .id=457, .teammate = &class.AB},
};

这更容易阅读和理解。另外,如果我们愿意,我们仍然可以将它用作 class.array[i] 的数组。

关于c - C 中的结构体初始化和打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53472786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com