06 结构体做函数参数
作用:将结构体作为函数的参数传入函数。
将结构体传入函数有两种传入方法:
- 值传递;
- 地址传递。
我们复习一下这两种传递的区别。
值传递分为实际参数和形式参数。简称为实参和形参。在值传递的时候,会把实际参数传递给形式参数。形式参数的改变不会影响实际参数的值。我们举个例子:(环境:Windows11 (arm/Apple M VM)/Visual Studio 2022/Debug/arm64)
#include <iostream>
using namespace std;
int func1(int a, int b);
int main()
{
int a = 10;
int b = 20;
cout << "在main函数(调用前),a和b的值是:\t" << a << "\t" << b << endl;
func1(a, b);
cout << "在main函数(调用后),a和b的值是:\t" << a << "\t" << b << endl;
system("pause");
return 0;
}
int func1(int a, int b)
{
int temp = a;
a = b;
b = temp;
cout << "在func1函数里面,a和b的值是:\t\t" << a << "\t" << b << endl;
return 0;
}
在main函数(调用前),a和b的值是: 10 20
在func1函数里面,a和b的值是: 20 10
在main函数(调用后),a和b的值是: 10 20
请按任意键继续. . .
而地址传递,是使用指针,将地址传入函数。函数会解引用找到地址内的数据。所以使用地址传入是会修改实参的数据值的。(环境:Windows11 (arm/Apple M VM)/Visual Studio 2022/Debug/arm64)
#include <iostream>
using namespace std;
int func1(int *a, int *b);
int main()
{
int a = 10;
int b = 20;
int* p1 = &a;
int* p2 = &b;
cout << "在main函数(调用前),a和b的值是:\t" << a << "\t" << b << endl;
func1(p1, p2);
cout << "在main函数(调用后),a和b的值是:\t" << a << "\t" << b << endl;
system("pause");
return 0;
}
int func1(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
cout << "在func1函数里面,a和b的值是:\t\t" << *a << "\t" << *b << endl;
return 0;
}
在main函数(调用前),a和b的值是: 10 20
在func1函数里面,a和b的值是: 20 10
在main函数(调用后),a和b的值是: 20 10
请按任意键继续. . .
总结:修改实参,地址传递;不改实参,值传递。
好回到今天的主题上,将结构体传入函数。
值传递:
#include <iostream>
#include <string>
using namespace std;
struct stu
{
string name;
int age;
int scores;
};
void printinfo1(struct stu a);
int main()
{
struct stu s;
s.name = "张三";
s.age = 18;
s.scores = 750;
printinfo1(s);
system("pause");
return 0;
}
void printinfo1(struct stu a)
{
cout << a.name << "\t" << a.age << "\t" << a.scores << endl;
}
在使用值传递传递结构体的时候。只要把需要传入的参数写入即可。比如上面是打印一个数据。那么传入的数据类型是struct stu
那么只需要 struct stu 函数里的变量名称
即可。
值传递:
#include <iostream>
#include <string>
using namespace std;
struct stu
{
string name;
int age;
int scores;
};
void printinfo2(struct stu *p);
int main()
{
struct stu s;
s.name = "张三";
s.age = 18;
s.scores = 750;
printinfo2(&s);
system("pause");
return 0;
}
void printinfo2(struct stu *p)
{
cout << p->name << "\t" << p->age << "\t" << p->scores << endl;
}
在值传递中,需要使用取值符,并且访问结构体里面的数据是使用->
来访问的。
#include <iostream>
#include <string>
using namespace std;
struct stu
{
string name;
int age;
int scores;
};
void printinfo1(struct stu a);
int main()
{
struct stu s;
s.name = "张三";
s.age = 18;
s.scores = 750;
printinfo1(s);
cout << "main:" << s.name << "\t" << s.age << "\t" << s.scores << endl;
system("pause");
return 0;
}
void printinfo1(struct stu a)
{
a.age = 100;
cout <<"值传递:"<< a.name << "\t" << a.age << "\t" << a.scores << endl;
}
值传递:张三 100 750
main:张三 18 750
请按任意键继续. . .
值传递不会修改实参。(环境:Windows11 (arm/Apple M VM)/Visual Studio 2022/Debug/arm64)
#include <iostream>
#include <string>
using namespace std;
struct stu
{
string name;
int age;
int scores;
};
void printinfo2(struct stu *p);
int main()
{
struct stu s;
s.name = "张三";
s.age = 18;
s.scores = 750;
printinfo2(&s);
cout << "main:" << s.name << "\t" << s.age << "\t" << s.scores << endl;
system("pause");
return 0;
}
void printinfo2(struct stu *p)
{
p->age = 200;
cout << p->name << "\t" << p->age << "\t" << p->scores << endl;
}
张三 200 750
main:张三 200 750
请按任意键继续. . .
地址传递会修改实参的数据值。
:-)