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

微软技术分享
优质创作者: 编程框架技术领域
领域专家: 操作系统技术领域
2024-03-01 14:26:37

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

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

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

控制台输出结果:

https://img-blog.csdnimg.cn/direct/8f15282f94f44768a6f6e190b747226e.png


文章来源: https://blog.csdn.net/u011775793/article/details/136296970
版权声明: 本文为博主原创文章,遵循CC 4.0 BY-SA 知识共享协议,转载请附上原文出处链接和本声明。


...全文
95 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

6,590

社区成员

发帖
与我相关
我的任务
社区描述
微软技术社区为中国的开发者们提供一个技术干货传播平台,传递微软全球的技术和产品最新动态,分享各大技术方向的学习资源,同时也涵盖针对不同行业和场景的实践案例,希望可以全方位地帮助你获取更多知识和技能。
windowsmicrosoft 企业社区
社区管理员
  • 微软技术分享
  • 郑子铭
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

微软技术社区为中国的开发者们提供一个技术干货传播平台,传递微软全球的技术和产品最新动态,分享各大技术方向的学习资源,同时也涵盖针对不同行业和场景的实践案例,希望可以全方位地帮助你获取更多知识和技能。

予力众生,成就不凡!微软致力于用技术改变世界,助力企业实现数字化转型。

试试用AI创作助手写篇文章吧