C++結(jié)構(gòu)體與函數(shù)—結(jié)構(gòu)體作為函數(shù)參數(shù)和返回值
2020-05-23 14:27:01
供稿:網(wǎng)友
結(jié)構(gòu)也可以用作函數(shù)參數(shù)或返回值。
結(jié)構(gòu)作為參數(shù)
我們?cè)谇懊娴囊恍┱鹿?jié)中知道,變量作為函數(shù)的參數(shù),了解它是值傳遞還是地址傳遞是非常重要的。因?yàn)檫@意味著參數(shù)在函數(shù)體內(nèi)的修改是否會(huì)影響到該變量本身。
不同于數(shù)組,結(jié)構(gòu)是按值傳遞的。也就是說(shuō)整個(gè)結(jié)構(gòu)的內(nèi)容都復(fù)制給了形參,即使某些成員數(shù)據(jù)是一個(gè)數(shù)組。
下面,我們就以一個(gè)實(shí)例來(lái)證明這一點(diǎn):(程序9.3.1)
#include "iostream.h"
struct student
{
int idNumber;
char name[15];
int age;
char department[20];
float gpa;
};
void display(student arg);//結(jié)構(gòu)作為參數(shù)
int main()
{
student s1={428004, "Tomato",20, "ComputerScience",84.5};//聲明s1,并對(duì)s1初始化
cout <<"s1.name的地址" <<&s1.name <<endl;
display(s1);
cout <<"形參被修改后……" <<endl;
display(s1);
return 0;
}
void display(student arg)
{
cout <<"學(xué)號(hào):" <<arg.idNumber <<"姓名:" <<arg.name <<"年齡:" <<arg.age <<endl <<"院系:" <<arg.department <<"成績(jī):" <<arg.gpa <<endl;
cout <<"arg.name的地址" <<&arg.name <<endl;
for (int i=0;i<6;i++)//企圖修改參數(shù)的成員數(shù)據(jù)
{
arg.name[i]='A';
}
arg.age++;
arg.gpa=99.9f;
}
運(yùn)行結(jié)果:
s1.name的地址0x0012FF54
學(xué)號(hào):428004姓名:Tomato年齡:20
院系:ComputerScience成績(jī):84.5
arg.name的地址0x0012FED8
形參被修改后……
學(xué)號(hào):428004姓名:Tomato年齡:20
院系:ComputerScience成績(jī):84.5
arg.name的地址0x0012FED8
通過(guò)上面這個(gè)程序,我們發(fā)現(xiàn)在函數(shù)中修改形參的值對(duì)實(shí)參是沒有影響的。并且通過(guò)輸出變量s1和參數(shù)arg的成員數(shù)據(jù)name所在地址,我們可以知道兩者是不相同的,即整個(gè)name數(shù)組也復(fù)制給了參數(shù)arg。
如果我們希望能在函數(shù)修改實(shí)參,則可以使用引用的方法。由于結(jié)構(gòu)往往整合了許多的成員數(shù)據(jù),它的數(shù)據(jù)量也絕對(duì)不可小覷。使用值傳遞雖然能夠保護(hù)實(shí)參不被修改,但是卻會(huì)或多或少地影響到程序的運(yùn)行效率。所以,一般情況下,我們選擇引用傳遞的方法。
結(jié)構(gòu)作為返回值
一般情況下,函數(shù)只能返回一個(gè)變量。如果要嘗試返回多個(gè)變量,那么就要通過(guò)在參數(shù)中使用引用,再把實(shí)參作為返回值。然而,這種方法會(huì)導(dǎo)致一大堆參數(shù),程序的可讀性也較差。
當(dāng)結(jié)構(gòu)出現(xiàn)以后,我們可以把所有需要返回的變量整合到一個(gè)結(jié)構(gòu)中來(lái),問(wèn)題就解決了。我們通過(guò)一段程序來(lái)了解如何讓函數(shù)返回一個(gè)結(jié)構(gòu):(程序9.3.2)
#include "iostream.h"
struct student
{
int idNumber;
char name[15];
int age;
char department[20];
float gpa;
};
student initial();//初始化并返回一個(gè)結(jié)構(gòu)
void display(student arg);
int main()
{
display(initial());//輸出返回的結(jié)構(gòu)
return 0;
}
void display(student arg)
{
cout <<"學(xué)號(hào):" <<arg.idNumber <<"姓名:" <<arg.name <<"年齡:" <<arg.age <<endl <<"院系:" <<arg.department <<"成績(jī):" <<arg.gpa <<endl;
}
student initial()
{
student s1={428004, "Tomato",20, "ComputerScience",84.5};//初始化結(jié)構(gòu)變量
return s1;//返回結(jié)構(gòu)
}
運(yùn)行結(jié)果:
學(xué)號(hào):428004姓名:Tomato年齡:20
院系:ComputerScience成績(jī):84.5