结构体作为函数参数
  结构体与C++中基本类型变量类似,同样可以作为应用程序中函数间的参数来传递使用。下面通过一个完整实例,结构体作为参数的几种参数传递方式展开讲述。
  1.准备实例
  打开UE工具,创建新的空文件并且另存为chapter0802.cpp。该代码文件随后会同makefile文件一起通过FTP工具传输至Linux服务器端,客户端通过scrt工具访问操作。程序代码文件编辑如下所示。
  /**
  * 实例chapter0802
  * 源文件chapter0802.cpp
  * 结构体参数传递方式实例
  */
  #include <iostream>
  using namespace std;
  struct bookInfo //定义书本结构体bookInfo,表示书本基本信息
  {
  int id; //定义结构体数据成员,整型变量id表示书本编号
  char bookname[50]; //定义结构体数据成员,包含50个元素的字符型数组表示书名
  char author[50]; //定义结构体数据成员,包含50个元素的字符型数组表示作者名
  char publisher[50]; //定义结构体数据成员,包含50个元素的字符型数组表示出版社名
  };
  /*
  * 函数功能:结构体变量参数值传递
  * 函数参数:传入结构体变量参数
  * 返回值:空
  */
  void dealValueParam(bookInfo book);
  /*
  * 函数功能:结构体变量参数引用传递
  * 函数参数:传入结构体引用参数
  * 返回值:空
  */
  void dealQuoteParam(bookInfo &book);
  /*
  * 函数功能:结构体变量指针参数传递
  * 函数参数:传入结构体指针参数
  * 返回值:空
  */
  void dealPointerParam(bookInfo *book);
  /*
  * 函数功能:结构体数组参数传递
  * 函数参数:传入结构体数组参数
  * 返回值:空
  */
  void dealStructArrary(bookInfo *book);
  /*主程序入口*/
  int main()
  {
  bookInfo book1 ={1,"Linux","jack","Oxford University Press"}; //定义结构体变量book1并初始化
  bookInfo book2 = book1; //定义结构体变量book2,使用变量book1直接为其初始化赋值
  bookInfo *book3 = &book2; //定义结构体指针变量,使用变量book2地址为其初始化赋值
  bookInfo book4[2] ={{10,"C++","john","Oxford University Press"},
  {11,"java","lining","Oxford UniversityPress"}}; //定义包含两个元素的结构体数组
  dealValueParam(book1); //调用结构体参数值传递处理函数
  cout<<"After dealValueParam =>book1 id:"<<book1.id<<endl; //打印函数处理后其成员值的变化
  dealQuoteParam(book2); //调用结构体参数引用传递处理函数
  cout<<"After dealQuoteParam =>book2 id:"<<book2.id<<endl; //打印函数处理后其成员值的变换
  dealPointerParam(book3); //调用结构体参数指针传递处理函数
  cout<<"After dealPointerParam =>book2id:"<<book2.id<<"or"<<book3->id<<endl;
  dealStructArrary(book4); //调用结构体数组传递处理函数
  return 0;
  }
  /*结构体变量参数值传递处理函数定义*/
  void dealValueParam(bookInfo book)
  {
  book.id = 2; //修改传入结构体参数中成员值
  cout<<"The bookinfo:"<<endl; //打印修改后传入结构体变量的成员值
  cout<<"bookid:"<<book.id<<" "<<"bookname:"<<book.bookname<<endl;
  cout<<"bookauthor:"<<book.author<<" "<<"bookpublisher:"<<book.publisher<<endl;
  }
  /*结构体变量参数引用传递处理函数定义*/
  void dealQuoteParam(bookInfo &book)
  {
  book.id = 3; //修改传入结构体参数中成员值
  cout<<"The bookinfo:"<<endl; //打印修改后传入结构体变量的成员值
  cout<<"bookid:"<<book.id<<" "<<"bookname:"<<book.bookname<<endl;
  cout<<"bookauthor:"<<book.author<<" "<<"bookpublisher:"<<book.publisher<<endl;
  }
  /*结构体变量参数指针传递处理函数定义*/
  void dealPointerParam(bookInfo *book)
  {
  book->id = 4; //修改传入结构体参数中成员值
  cout<<"The bookinfo:"<<endl; //打印修改后传入结构体变量的成员值
  cout<<"bookid:"<<book->id<<" "<<"bookname:"<<book->bookname<<endl;
  cout<<"bookauthor:"<<book->author<<" "<<"bookpublisher:"<<book->publisher<<endl;
  }
  /*结构体数组参数传递处理函数定义*/
  void dealStructArrary(bookInfo *book)
  {
  cout<<"The book struct arrayinfo:"<<endl; //打印传入结构体数组元素信息
  for(int i = 0;i < 2;i++)
  {
  cout<<"bookid:"<<book[i].id<<" "<<"bookname:"<<book[i].bookname<<endl;
  cout<<"book author:"<<book[i].author<<""<<"book publisher:"<<book[i].publisher<<endl;
  }
  }
  本实例程序主要通过结构体方式演示函数传值、传引用、传指针以及数组参数功能。程序主要由主函数、传值打印信息、引用传递打印信息、指针参数传递打印信息以及数组参数传递信息打印函数组成。具体程序剖析见注释与后面程序讲解。
  2.编辑makefile
  Linux平台下需要编译源文件为chapter0802.cpp,相关makefile工程文件编译命令编辑如下所示。
  OBJECTS=chapter0802.o
  CC=g++
  chapter0802: $(OBJECTS)
  $(CC)$(OBJECTS) -g -o chapter0802
  clean:
  rm -fchapter0802 core $(OBJECTS)
  submit:
  cp -f -rchapter0802 ../bin
  cp -f -r*.h ../include
  上述makefile文件套用前面的模板格式,主要替换了代码文件、程序编译中间文件、可执行程序等。在编译命令部分-g选项的加入,表明程序编译同时加入了可调式信息。
  3.编译运行程序
  当前shell下执行make命令,生成可执行程序文件。随后通过make submit命令提交程序文件至本实例bin目录,通过cd命令定位至实例bin目录,执行该程序文件运行结果如下所示。
  [ocs@vm-rh:~/users/wangfeng/Linux_c++/chapter08/chapter0802/src]$make
  g++ -c -ochapter0802.o chapter0802.cpp
  g++ chapter0802.o -g -o chapter0802
  [ocs@vm-rh:~/users/wangfeng/Linux_c++/chapter08/chapter0802/src]$makesubmit
  cp -f -r chapter0802 ../bin
  cp -f -r *.h ../include
  [ocs@vm-rh:~/users/wangfeng/Linux_c++/chapter08/chapter0802/src]$cd../bin
  [ocs@vm-rh:~/users/wangfeng/Linux_c++/chapter08/chapter0802/bin]$./chapter0802
  The book info:
  book id:2 book name:Linux
  book author:jack book publisher:Oxford UniversityPress
  After dealValueParam => book1 id:1
  The book info:
  book id:3 book name:Linux
  book author:jack book publisher:Oxford UniversityPress
  After dealQuoteParam => book2 id:3
  The book info:
  book id:4 book name:Linux
  book author:jack book publisher:Oxford UniversityPress
  After dealPointerParam => book2 id:4or4
  The book struct array info:
  book id:10 book name:C++
  book author:john book publisher:Oxford UniversityPress
  book id:11 book name:java
  book author:lining book publisher:Oxford UniversityPress
  以上实例共演示了结构体变量三种参数传递方式以及结构体数组作为参数传递的处理。结构体变量作为函数参数在传递方式与C++中基本数据类型变量相同。该实例重温了函数参数传递章节的知识。该程序首先定义了书本信息结构体bookInfo,随后声明了4个功能函数。前三个函数处理结构体变量三种参数传递,后一个函数处理结构体数组参数传递。
  主程序中首先定义了2个bookInfo类型的变量,其中结构体变量book1定义同时初始化,变量book2定义同时使用book1变量赋值初始化。可见结构体不同于数组可以作为普通类型变量相互赋值。定义结构体指针book3并将变量book2的地址给其赋值初始化,即book3指向了结构体变量book2的地址。book4为包含两个结构体变量的数组,定义同时进行了初始化。
  随后调用4个预先定义好的参数处理功能函数。第一个函数主要针对结构体变量作为参数传值方式处理,传入结构体变量并修改其成员值后在函数体内打印该结构体变量成员值。该函数调用后打印了被修改的成员id的值,按照值传递的约定函数调用时实参只是拷贝了副本给形参操作,因此形参在函数内的修改不会影响实参。
  第二个、第三个函数分别以引用参数传递以及指针参数传递的方式处理传入结构体变量。由于引用传递和指针传递都是直接操作实参地址,所以函数调用时形参的修改会直接影响实参。
  后以结构体数组作为参数进行传递处理,结构体数组名作为参数在函数调用时会完全退化到指向该结构体数组首地址的指针上。在函数体内完全可以按照结构体指针的方式方便的操作结构体数组。