[C++] 结构体中的值传递、地址传递、引用传递

什么是值传递、地址传递、引用传递?

值传递、地址传递、引用传递是三种常见的参数传递方式。

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;
}

控制台输出结果:

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老狼IT工作室

你的鼓励将是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值