问题描述:
根据下列代码和结果回答下列问题。
代码:
// Created by 黑马程序员.
#include "iostream"
using namespace std;
//学生结构体定义
//学生结构体定义
struct student
{
//成员列表
string name; //姓名
int age; //年龄
int score; //分数
};
//值传递
void printStudent(student stu )
{
stu.age = 128;
cout << "子函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:" << stu.score << endl;
}
//地址传递
void printStudent2(student *stu)
{
stu->age = 128;
cout << "子函数中 姓名:" << stu->name << " 年龄: " << stu->age << " 分数:" << stu->score << endl;
}
int main() {
system("chcp 65001");
student stu = { "张三",18,100};
//值传递
printStudent(stu);
cout << "主函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:" << stu.score << endl;
cout << endl;
//地址传递
printStudent2(&stu);
cout << "主函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:" << stu.score << endl;
system("pause");
return 0;
}
结果:
D:\CLion_code\cmake-build-debug\CLion_code.exe
Active code page: 65001
子函数中 姓名:张三 年龄: 128 分数:100
主函数中 姓名:张三 年龄: 18 分数:100
子函数中 姓名:张三 年龄: 128 分数:100
主函数中 姓名:张三 年龄: 128 分数:100
Press any key to continue . . .
为什么值传递中子函数和主函数的输出不一样,但是地址传递中子函数和主函数的输出是一样的呢?
问题解答:
在 C++ 中,值传递和地址传递的行为有显著区别,正是这导致了你观察到的输出差异。
值传递
在 printStudent
函数中,参数 stu
是以值传递的方式传递的。这意味着在调用函数时,会创建一个 stu
的副本。在函数内部对 stu.age
的修改不会影响原来的 stu
,因此主函数中的 stu.age
保持不变。输出结果显示:
- 子函数中:
年龄:128
- 主函数中:
年龄:18
地址传递
在 printStudent2
函数中,参数是一个指向 student
结构体的指针(student *stu
),即地址传递。这意味着在调用函数时,传递的是原始对象的地址。在函数内部对 stu->age
的修改会直接影响到主函数中的 stu
对象。输出结果显示:
- 子函数中:
年龄:128
- 主函数中:
年龄:128
总结
因此,值传递只改变了副本的内容,而地址传递直接修改了原始对象的内容,这就是为什么你在两种情况下看到不同的输出。