结构体数组
  C++中结构体作为一种自定义类型,可以定义该类型的数组供程序批量处理结构体记录。元素都为结构体类型的数组,称为结构体数组。结构体数组定义与其变量定义相似,同样有两种定义实现方式。下面通过两种方式的结构体数组定义实例,了解结构体数组的基本概念。
  struct bookInfo //定义结构体bookInfo表示书本信息
  {
  intid; //定义结构体成员,整型变量id表示书本编号
  charbookname[100]; //定义结构体成员,包含100个元素的字符数组表示书名
  charauthor[100]; //定义结构体成员,定义结构体authorInfo变量author表示作者信息
  charpublisher[100]; //定义结构体成员,包含100个元素的字符数组表示出版社名
  };
  bookInfo book[3]; //定义拥有3个结构体变量数组
  或
  struct bookInfo //定义结构体bookInfo表示书本信息
  {
  intid; //定义结构体成员,整型变量id表示书本编号
  charbookname[100]; //定义结构体成员,包含100个元素的字符数组表示书名
  charauthor[100]; //定义结构体成员,定义结构体authorInfo变量author表示作者信息
  charpublisher[100]; //定义结构体成员,包含100个元素的字符数组表示出版社名
  }book[3]; //声明结构体同时定义结构体数组,该数组拥有3个结构体变量元素
  如上实例中定义了两种方式的结构体数组。一种为结构体定义后以该类型定义结构体数组。另一种方式为定义结构体类型同时定义结构体类型数组。该结构体数组包含5个元素,每个元素都为一个结构体bookInfo类型的变量。结构体数组初始化、元素成员的访问也与结构体变量初始化及访问方式类似。
  bookInfo book[3] = {{1,”Linux”,”jack”,” OxfordUniversity Press”},{2,”C++”,”jonh”,” Oxford University Press”},
  {3,”java”,”lining”,”Oxford University Press”}};
  book[0].id = 4;
  结构体数组初始化方式与单个结构体变量初始化方式类似。用一对大括号表示,其中每个元素都采用单个结构体变量初始化方式。不同结构体变量作为元素之间通过逗号隔开,依次初始化结构体数组中每个元素。由于结构体数组每个元素又是结构体变量,所以初始化每个元素意味着初始化单个结构体变量。
  结构体数组访问其元素通过下标来进行,依然可以使用下标与“.”符号来组合访问具体结构体数组元素中的成员。上例中book[0].id = 4语句即通过下标与点符号来访问并修改该结构体数组第一个元素的成员id的值。结构体数组元素之间可以直接相互赋值,但是整个结构体数组之间不允许互相赋值。
  C++程序中结构体数组多用来处理特定格式数据的记录,如下通过一个打印记录信息的实例来了解一下结构体数组在应用程序中的操作。
  1.准备实例
  打开UE工具,创建新的空文件并且另存为chapter0801.cpp。该代码文件随后会同makefile文件一起通过FTP工具传输至Linux服务器端,客户端通过scrt工具访问操作。程序代码文件编辑如下所示。
  /**
  * 实例chapter0801
  * 源文件chapter0801.cpp
  * 数组应用实例
  */
  #include <iostream>
  using namespace std;
  struct record //定义结构体record,包含两结构体成员
  {
  int id; //结构体成员整型变量id
  char data[20]; //结构体成员字符数组data
  };
  /*
  * 函数功能:打印传入结构体数组的记录信息
  * 函数参数:传入结构体数组名及其数组长度
  * 返回值:空
  */
  void showReacord(record *array,int length);
  int main()
  {
  record record_array[2] ={{1,"lining"},{2,"jack"}}; //定义拥有2个元素的结构体数组,同时初始化
  showReacord(record_array,2); //调用打印结构体数组记录函数
  return 0;
  }
  void showReacord(record *array,int length) //打印传入结构体数组的记录信息函数定义
  {
  for(int i=0;i<length;i++) //根据传入的数组长度作为循环条件打印数组记录
  {
  cout<<"The structarray"<<"["<<i<<"]:"<<endl; //打印结构体数组元素提示信息
  cout<<array[i].id<<""<<array[i].data<<endl; //打印结构体数组元素信息
  }
  }
  上述实例主要演示了结构体作为元素的数组应用情况。本程序由两个部分组成,比主函数入口新增加了打印结构体数组元素的方法。该方法主要用于遍历并向屏幕输出数组元素值。关于函数的概念,在后续章节会有专门的讲解,初学者在此处主要掌握数组赋值以及相互遍历的使用方法即可。
  2.编辑makefile
  Linux平台下需要编译源文件为chapter0801.cpp,相关makefile工程文件编译命令编辑如下所示。
  OBJECTS=chapter0801.o
  CC=g++
  chapter0801: $(OBJECTS)
  $(CC)$(OBJECTS) -g -o chapter0801
  clean:
  rm -fchapter0801 core $(OBJECTS)
  submit:
  cp -f -rchapter0801 ../bin
  cp -f -r*.h ../include
  上述makefile文件套用了上个实例模板。之所以其中采用变量定义替换的方式,目的是为了方便编译程序的替换。从makefile工程文件中可以看出,布局是相同的。不同的地方仅仅是代码的文件名、生成可执行程序的名称等,大大方便了每次都要重新编写一遍编译命令的编辑方式。
  3.编译运行程序
  当前shell下执行make命令,生成可执行程序文件,随后通过make submit命令提交程序文件至本实例bin目录,通过cd命令定位至实例bin目录,执行该程序文件运行结果如下所示。
  [developer@localhost src]$ make
  g++ -c -o chapter0801.o chapter0801.cpp
  g++ chapter0801.o -g -o chapter0801
  [developer @localhost src]$ make submit
  cp -f -r chapter0801 ../bin
  cp -f -r *.h ../include
  [developer @localhost src]$ cd ../bin
  [developer @localhost bin]$ ./chapter0801
  The struct array[0]:
  1 lining
  The struct array[1]:
  2 jack
  以上实例主要实现了结构体数组的定义、初始化、作为函数参数传递,通过数组下标访问结构体元素及其成员变量等使用方式。通过本小节的讲述主要应该掌握结构体数组的基本概念及其定义和相关的操作,结构体数组作为记录形式处理还会在后续章节中有所体现,尤其在Linux系统下的文件处理部分,结构体数组会有更多的应用。