结构体的定义、初始化和赋值

编程语言及工具

102人已加入

描述

  结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,叫做结构。

  在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。

  结构体定义

编程

  结构体的定义如下所示,struct为结构体关键字,tag为结构体的标志,member-list为结构体成员列表,其必须列出其所有成员;variable-list为此结构体声明的变量。

  struct tag {

  member-list

  } variable-list ;

  在一般情况下,tag、member-list、variable-list这3部分至少要出现2个。以下为示例:

  //此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c

  //同时又声明了结构体变量s1

  //这个结构体并没有标明其标签

  struct {

  int a;

  char b;

  double c;

  } s1;

  //同上声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c

  //结构体的标签被命名为SIMPLE,没有声明变量

  struct SIMPLE{

  int a;

  char b;

  double c;

  };

  //用SIMPLE标签的结构体,另外声明了变量t1、t2、t3

  struct SIMPLE t1, t2[20], *t3;

  //也可以用typedef创建新类型

  typedef struct{

  int a;

  char b;

  double c;

  } Simple2;

  //现在可以用Simple2作为类型声明新的结构体变量

  Simple2 u1, u2[20], *u3;

  在上面的声明中,第一个和第二声明被编译器当作两个完全不同的类型,即使他们的成员列表是一样的,如果令t3=&s1,则是非法的。

  定义结构变量的方法

  1、先定义结构,再说明结构变量。

  例如:

  struct stu

  {

  int num;

  char name[20];

  int age;

  };

  struct stu boy1,boy2;

  说明了两个变量boy1和boy2为stu结构类型。

  也可以用宏定义使一个符号常量来表示一个结构类型, 例如:

  #define STU struct stu

  STU

  {

  int num;

  char name[20];

  int age;

  };

  STU boy1,boy2;

  2、在定义结构类型的同时说明结构变量。

  例如:

  struct stu

  {

  int num;

  char name[20];

  int age;

  }boy1,boy2;

  3、直接说明结构变量。

  例如:

  struct

  {

  int num;

  char name[20];

  int age;

  }boy1,boy2;

  第三种方法与第二种方法的区别在于第三种方法中省去了结构名,而直接给出结构变量。

  说明了boy1,boy2变量为stu类型后,即可向这两个变量中的各个成员赋值。

  在上述stu结构定义中,所有的成员都是基本数据类型或数组类型。成员也可以又是一个结构, 即构成了嵌套的结构。

  使用结构变量成员的一般形式是:

  结构变量名。成员名

  例如:

  boy1.num

  /*即第一个人的学号 */

  如果成员本身又是一个结构则必须逐级找到最低级的成员才能使用。

  例如:boy1.birthday.month

  即第一个人出生的月份成员可以在程序中单独使用,与普通变量完全相同。

  结构体初始化

编程

  1、结构体的构造函数中初始化

  在C++中,结构体与类在使用上已没有本质上的区别了,所以可以使用构造函数来初始化。如下代码所示:

  struct Stu

  {

  int nNum;

  bool bSex;

  char szName[20];

  char szEmail[100];

  //构造函数初始化

  Stu()

  {

  nNum = 0;

  bSex = false;

  memset(szName,0,sizeof(szName));

  memset(szEmail,0,sizeof(szEmail));

  }

  };

  你可能已经发现了,如果结构体中有大量成员,一个个赋值,相当麻烦。那么你可以这样写:

  struct Stu

  {

  int nNum;

  bool bSex;

  char szName[20];

  char szEmail[100];

  //构造函数初始化

  Stu()

  {

  memset(this,0,sizeof(Stu));

  //或者是下面的格式

  //memset(&nNum,0,sizeof(Stu));

  }

  };

  如果在结构体中分配了指针,并且指针指向一个堆内存,那么就在析构函数中释放。以上便是在构造函数中初始化。

  2、继承模板类初始化。

  首先定义一个模板基类:

  template 《typename T》

  class ZeroStruct

  {

  public:

  ZeroStruct()

  {

  memset(this,0,sizeof(T));

  }

  };

  之后定义的结构体都继承于此模板类。

  struct Stu:ZeroStruct《Stu》

  {

  int nNum;

  bool bSex;

  char szName[20];

  char szEmail[100];

  };

  这样也能实现初始化。

  3、定义时初始化。

  struct Stu

  {

  int nNum;

  bool bSex;

  char szName[20];

  char szEmail[100];

  };

  //定义时初始化

  Stu stu1 = {0};

  在有的结构体中,第一个成员表示结构体的大小,那么就可以这样初始化:

  struct Stu

  {

  int nSize; //结构体大小

  int nNum;

  bool bSex;

  char szName[20];

  char szEmail[100];

  };

  Stu stu1 = {sizeof(Stu),0};

  后面的0,可以省略掉,直接写成:Stu stu1 = {sizeof(Stu)};后面自动会用0填充。

  关于结构体的类型要注意的几点:

  (1)类型与变量是不同的概念,不要混淆。只能对结构体变量中的成员赋值,而不能对结构体类型赋值。

  (2)对结构体变量中的成员(即“域”),可以单独使用,它的作用与地位相当于同类型的普通变量。

  (3)结构体的成员也可以是一个结构体变量。

  结构变量的赋值

  你可对结构体变量的成员逐个赋值,这种方式和数组相像,数组就是逐个元素逐一赋值(对于数组,除非初始化,否则你别无选择,只能这样赋值)。不同于数组,标准C中结构体变量可以整体赋值。

  例一:

  #include 《stdio.h》

  int main(void)

  {

  struct student

  {

  long int num;

  int age;

  char* name;

  }st1={200,18,“zhangsan”};

  struct student st2,st3;

  printf(“ NO. age name /n”);

  printf(“ %ld %d %s/n”,st1.num,st1.age,st1.name);

  getch();

  st2.num=199;

  st2.age=19;

  st2.name=“lisi”;

  printf(“ %ld %d %s/n”,st2.num,st2.age,st2.name);

  getch();

  st3=st2;

  printf(“ %ld %d %s/n”,st3.num,st3.age,st3.name);

  getch();

  printf(“/n/n struct student:%d”,sizeof(struct student));

  getch();

  return 0;

  }

  例二:

  #include 《stdio.h》

  #include 《conio.h》

  struct birth

  {

  int year;

  int month;

  int day;

  };

  struct student

  {

  long int num;

  struct birth birthday;

  char* name;

  }st1={200,{1988,8,8},“zhangsan”};

  int main(void)

  {

  struct student st2;

  st2=st1;

  printf(“ %ld %s %d/n”,st2.num,st2.name,sizeof(int));

  printf(“ year: %d month: %d month: %d/n”,

  st2.birthday.year,

  st2.birthday.month,

  st2.birthday.day);

  getch();

  return 0;

  }

  注意

  当你的结构体变量中有存放多个字符的成员,建议你将它定义为数组(比如前面的姓名成员,不知道数组该开辟多大时,也可以定义为指针)。原因是指针变量不能存放实际数据,仅仅是地址。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分