什么是值传递、地址传递、引用传递?
值传递、地址传递、引用传递是三种常见的参数传递方式。
1)值传递(Pass by Value):将实际参数的值复制一份给形式参数,函数内部操作的是形式参数的副本。函数对形式参数的操作不会影响实际参数的值。
2)地址传递(Pass by Address):将实际参数的地址传递给形式参数,函数内部通过指针访问实际参数的值。函数对形式参数的操作会影响实际参数的值。
3)引用传递(Pass by Reference):将实际参数的引用传递给形式参数,函数内部通过引用访问实际参数的值。函数对形式参数的操作会影响实际参数的值,实质上是在函数内部操作的是同一个变量。引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
在C++中,值传递是默认的传递方式,可以通过指针或引用来实现地址传递和引用传递。
结构体的值传递、地址传递、引用传递
#include <iostream>
#include<string>
using namespace std;
struct Student {
string name;
int age;
int score;
};
void printStudent1(Student s) {
//值传递
s.age = 100;
cout << "值传递后printStudent1中的值" << endl;
cout << "姓名:" << s.name << endl;
cout << "年龄:" << s.age << endl;
cout << "成绩:" << s.score << endl;
cout << endl;
}
void printStudent2(Student* p) {
//地址传递
p->age = 200;
cout << "地址传递后printStudent2的值" << endl;
cout << "姓名:" << p->name << endl;
cout << "年龄:" << p->age << endl;
cout << "成绩:" << p->score << endl;
cout << endl;
}
void printStudent3(Student& s) {
//引用传递
s.age = 300;
cout << "引用传递后printStudent3中的值" << endl;
cout << "姓名:" << s.name << endl;
cout << "年龄:" << s.age << endl;
cout << "成绩:" << s.score << endl;
cout << endl;
}
int main()
{
Student s1;
s1.name = "张三";
s1.age = 17;
s1.score = 98;
cout << "s1 main函数中的值" << endl;
cout << "姓名:" << s1.name << endl;
cout << "年龄:" << s1.age << endl;
cout << "成绩:" << s1.score << endl;
cout << endl;
printStudent1(s1);//对s进行值传递
cout << "值传递后 s1 main函数中的值" << endl;
cout << "姓名:" << s1.name << endl;
cout << "年龄:" << s1.age << endl;
cout << "成绩:" << s1.score << endl;
cout << endl;
Student s2;
s2.name = "李四";
s2.age = 18;
s2.score = 80;
cout << "s2 main函数中的值" << endl;
cout << "姓名:" << s2.name << endl;
cout << "年龄:" << s2.age << endl;
cout << "成绩:" << s2.score << endl;
cout << endl;
printStudent2(&s2);//对s进行地址传递,需要加上取地址符
cout << "地址传递后 s2 main函数中的值" << endl;
cout << "姓名:" << s2.name << endl;
cout << "年龄:" << s2.age << endl;
cout << "成绩:" << s2.score << endl;
cout << endl;
Student s3;
s3.name = "王五";
s3.age = 16;
s3.score = 88;
cout << "s3 main函数中的值" << endl;
cout << "姓名:" << s3.name << endl;
cout << "年龄:" << s3.age << endl;
cout << "成绩:" << s3.score << endl;
cout << endl;
printStudent3(s3);//对s进行引用传递
cout << "引用传递后 s3 main函数中的值" << endl;
cout << "姓名:" << s3.name << endl;
cout << "年龄:" << s3.age << endl;
cout << "成绩:" << s3.score << endl;
cout << endl;
return 0;
}
控制台输出结果: