将一个结构体变量中的数据传递给另一个函数,有下面3种方法:
(1)用结构体变量名作参数。例如,用结构体变量stu作函数实参,将实参值传给形参。用结构体变量作实参时,采取的是"值传递"的方式,将结构体变量所占的内存单元的内容全部顺序传递给形参。形参也必须是同类型的结构体变量。在函数调用期间形参也要占用内存单元。这种传递方式在空间和时间上开销较大,如果结构体的规模很大时,开销是很可观的。此外,由于采用值传递方式,如果在执行被调用函数期间改变了形参(是结构体变量)的值,该值不能返回主调函数,这往往不能满足使用要求。因此一般较少用这种方法。
编写程序:
(2)用指向结构体变量的指针作实参,将结构体变量的地址传给形参。请注意程序注释。
编写程序:
此程序在定义结构体变量stu时赋初值,这样程序可简化些。print函数中的形参p被定义为指向Student类型数据的指针变量。在main函数中定义指针变量pt,并将stu的起始地址赋给pt,这样pt就指向stu。调用print函数时,实参指针变量pt将stu的起始地址传送给形参p(p也是基类型为student的指针变量)。这样形参p也就指向stu。在print函数中输出p所指向的结构体变量的各个成员值,也就是stu的成员值。
在main函数中也可以不定义指针变量pt,而在调用print函数时以&stu作实参,把stu的起始地址传给实参p。
(3)用结构体变量的引用作函数形参,它就成为实参(是结构体变量)的别名。
编写程序:
运行结果:
3种方法的比较:
程序(1)用结构体变量作实参和形参,程序直观易懂,但是在调用函数时形参要单独开辟内存单元。实参中全部内容通过值传递方式一一传给形参,如果结构体变量占的存储空间很大,则在虚实结合时空间和时间的开销都比较大,效率不高的。
程序(2)采用指针变量作为实参和形参,在调用函数时形参只占用4字节,实参只是
将stu的起始地址传给形参,而不是将结构体变量的各成员的值一一传给形参,因而空间和时间的开销都很小,效率较高。但看程序时不如程序(1)那样直观。
程序(3)的实参是结构体Student类型变量,而形参用Student类型的引用,虚实结合时传递的是stu的地址,因而效率较高。在执行print函数期间,实参stu和形参stud代表同一对象,stu.num就是stud.num,程序比较直观易懂,它兼有(1)和(2)的优点。
通过本例可以体会到C++为什么要增设变量的引用。引用主要用作函数参数,它可以提高效率,而且保持程序良好的可读性。在面向对象的程序设计中会用到这种方法。