C语言中的结构初始化和打印

时间:2018-11-25 22:49:38

标签: c struct initialization

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

Dim firName, secName As String

firName = "Da*"
secName = "Daniel"

search = InStr(1, secName, firName, vbTextCompare)

MsgBox (search)

1 个答案:

答案 0 :(得分:1)

代码的作用:

  • 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 };初始化结构的某些命名成员。

通过使用联合,匿名结构和指定的初始化程序来重写您的示例,我们改为:

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]的数组。