C++中结构体不同于数组使用。结构体中可以存放不同类型的数据元素,它比数组使用更加灵活。一个结构体可以存放不同类型的数据,从而将不同类型数据放到一起组成一条记录。结构体部分的学习也是面向对象中类的基础。结构体定义将会在C++程序中形成一种类型的概念,用于开发者创建其对象实例使用。C++中结构体定义的一般语法形式:
  struct struct_name //声明结构体名称为struct_name
  {
  typedata_name1; //结构体数据成员1
  typedata_name2; //结构体数据成员2
  …
  };
  结构体声明由关键字struct标识,随后是结构体的名字struct_name。它由开发者自己定义符合要求的标识符。一对大括号中间包含着结构体成员的定义,结构体成员可以是C++基本数据类型变量也可以是结构体或结构体指针。后结构体定义以分号为结尾,可以将结构体定义看成一条完整的语句。
  结构体声明仅仅定义了结构体这样一种类型,此刻的结构体并不占用内存空间。真正编译器分配内存空间是在使用该结构体类型定义其对象时发生的。下面通过一个结构体声明实例来直观的了解结构体定义使用情况。
  struct Record //定义结构体Record
  {
  intid; //结构体成员,整型变量id
  chardata[100]; //结构体成员,字符型数组data
  };
  Record record; //结构体对象定义
  如上实例声明名为Record的结构体,包含两个结构体成员变量:一个整型变量id和一个包含100个元素的字符数组。随后使用该结构体作为类型定义其变量,也可称为其对象。此时编译器为其结构体变量分配内存,该结构体变量可以在程序中用于存储数据等操作。结构体声明还可以在声明的同时定义其变量,使得结构体使用更加紧凑。这样在检查程序时有多少该结构体变量的应用一目了然。下面通过这种方式的结构体类型声明和变量定义来了解其使用情况。
  struct Record //定义结构体Record
  {
  intid; //结构体成员,整型变量id
  chardata[100]; //结构体成员,字符型数组data
  }record1,record2;//结构体声明同时对象定义
  以上实例在声明结构体类型的同时定义其两个对象record1与record2。结构体声明时可以根据需要定义多个变量,之间使用逗号隔开,后末尾不要忘记使用分号为结尾。
  结构体成员访问及初始化
  C++中结构体声明之后可以使用其定义变量,结构体变量的定义在C语言中必须结构体名前加上struct关键字。而C++中除了包含这种方式定义外,还可以简化其定义方式,允许定义结构体变量时直接使用结构体名作为类型来定义。结构体变量定义完毕后,结构体变量在使用前需要初始化其值。此时涉及结构体变量访问其成员的问题。C++中通过“.”符号紧跟在变量名之后来访问其某个成员。如下实例定义结构体变量,通过“.”符号方式访问结构体变量的成员,并为其初始化值。
  struct Record //定义结构体Record
  {
  intid; //结构体成员,整型变量id
  chardata[10]; //结构体成员,字符型数组data
  };
  Record record; //定义结构体Record对象record
  record.id = 1; //为结构体id成员变量赋值
  上述实例中定义包含两个成员的结构体类型Record。随后使用该结构体类型定义其变量,此刻结构体中成员被分配了内存空间,该变量使用“.”符号访问其数据成员id并且给其初始化值为1。C++中结构体初始化通常有两种方式,一种是定义结构体变量的同时进行初始化。另一种是定义结构体变量后,针对其数据成员分别赋值。两个结构体变量初始化方式实例如下所示。
  struct Record //定义结构体Record
  {
  intid; //结构体成员,整型变量id
  chardata[10]; //结构体成员,字符型数组data
  }record = {1,”jack”}; //结构体对象record定义同时初始化
  或
  Record record1 = {1,”hello”}; //定义结构体对象record1并初始化
  Record record2; //定义结构体对象record2
  Record2.id = 2; //为结构体对象成员id赋值
  Record2.data = “welcome”; //为结构体对象成员data赋值
  定义结构体变量同初始化与数组类似,依然采用一对大括号,其间的数据值依次给结构体中成员变量赋值。该种方式初始化又有两种形式,一种是在声明结构体的同时定义其变量并初始化。另一种是声明结构体后,使用结构体定义其变量再初始化。第二种初始化方式通过结构体变量使用“.”符号访问到结构体对应的数据成员,单个的使用赋值的方式来初始化。两种方式的结果同样是将结构体成员变量赋上初值供程序中处理使用。
  结构体指针
  结构体既然可以作为用户自定义类型,那么可以定义使用该类型的指针,称为结构体指针。结构体指针的定义使用与普通数据类型相同。当使用结构体类型定义变量时,为该结构体变量分配一块内存空间供处理使用,与数组类似结构体指针则指向了这块内存空间的首地址。
  结构体指针访问结构体变量成员则使用“->”符号来操作,下面通过一个实例来了解结构体指针变量的定义以及其初始化方式。
  struct bookInfo //定义结构体bookInfo表示书本信息
  {
  intid; //定义结构体成员,整型变量id表示书本编号
  charbookname[100]; //定义结构体成员,包含100个元素的字符数组表示书名
  charauthor[100]; //定义结构体成员,包含100个元素的字符数组表示作者名
  charpublisher[100]; //定义结构体成员,包含100个元素的字符数组表示出版社名
  };
  bookInfo book1 = {1,”Linux”,”jack”,”OxfordUniversity Press”};//定义该结构体类型变量,同时初始化
  bookInfo *book2 = &book1; //定义该结构体指针,同时将book1地址用于其初始化
  book2->id = 2; //通过指针的方式访问并修改其指向结构体成员id的值
  以上实例定义书的基本信息结构体为bookInfo。随后采用该结构体定义其变量book1同时初始化该结构体变量各个数据成员。定义结构体指针变量book2,将结构体变量book1的地址赋给book2指针变量,即此刻book2指针变量指向了结构体变量book1的首地址。与数组不同,结构体可以像C++中基本数据类型变量那样相互赋值。如再定义bookInfo结构体变量book3,可以执行book3 = book2这样的语句用来实现结构体变量之间的相互赋值。
  上述例子中,结构体指针变量book2指向book1变量地址后,可以通过“->”符号访问其结构体变量成员并修改其值。如上book2->id =2语句访问结构体变量book1的数据成员id并修改其值为2。
  结构体另一个灵活之处在于结构体的嵌套定义,即结构体中可以再以结构体变量或者结构体指针作为其成员。结构体嵌套定义其变量初始化方式与结构体变量初始化方式相同。下面通过在上述实例基础上增加结构体成员的实例来了解嵌套结构体定义及初始化使用方式。
  struct authorInfo //定义结构体authorInfo表示作者信息
  {
  charname[50]; //定义结构体成员,包含50个元素的字符数组表示作者姓名
  char country[50]; //定义结构体成员,包含50个元素的字符数组表示作者国籍
  charcity[50]; //定义结构体成员,包含50个元素的字符数组表示作者所在城市
  };
  struct bookInfo //定义结构体bookInfo表示书本信息
  {
  intid; //定义结构体成员,整型变量id表示书本编号
  charbookname[100]; //定义结构体成员,包含100个元素的字符数组表示书名
  authorInfoauthor; //定义结构体成员,定义结构体authorInfo变量author表示作者信息
  charpublisher[100]; //定义结构体成员,包含100个元素的字符数组表示出版社名
  };
  bookInfo book1 = {1,”Linux”,{“jack”,”American”,”NewYork”},”Oxford University Press”};//定义结构体变量并初始化
  bookInfo *book2 = &book1; //定义结构体指针,同时使用结构体变量book1地址初始化
  strcpy(book2->author.name,”jonh”); //采用结构体指针的方式访问指向结构体变量的成员并修改值
  以上实例中定义两个结构体,其中bookInfo结构体中使用到结构体authorInfo的变量作为其成员。随后定义结构体bookInfo变量book1以及其结构体指针book2,同时初始化book1并将其地址用于初始化结构体指针book2,即结构体指针book2指向了变量book1的地址。结构体指针通过符号“->”访问其指向的结构体变量book1的成员变量。通过strcpy拷贝函数修改了结构体变量author的成员变量name值,由于字符数组不能够直接互相赋值,所以这里需要使用strcpy采用拷贝赋值的方式实现该字符数组的赋值。
  结构体指针在软件编程中有许多的应用,作为函数的参数传递、通过指针的方式方便的操纵结构体成员参与运算等。结构体指针使用恰当,在完成程序处理功能之外会提高程序的处理性能和效率。