结构变量作为函数参数按地址传递和按值传递的区别

img


搞不懂为什么用set1就会是原来的数,用set2就是0,0,0?

因为 set1是 值传递,传的是 结构体的一个副本
而 set2是引用传递,传的是结构体的地址

void set1( Account obj); 函数得形参 obj 是set1() 函数里得局部变量,它的作用域就在函数体内,它的生命周期也随函数的执行结束而结束,所以在函数内对它赋值后,待函数执行完退出时obj 的生命也结束了,并不对实参 a 产生任何作用。
void set2(Account &obj); 函数形参 obj 是 (Account &) 引用,调用函数时相当于 Account & obj = &a; 理解为在set2()函数里直接对 a 操作,赋值语句就成这样了:a. id = 0; a.balance = 0; a.overdraft = 0; 。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7594484
  • 以下回答来自chatgpt:

    答案:

    结构变量的按地址传递和按值传递的差别在于函数中对结构体成员的修改是否影响了原始变量。按地址传递是指将结构体的地址作为参数传递给函数,函数接收到地址后,可以直接修改原始结构体的成员。而按值传递是指将结构体的副本作为参数传递给函数,该函数修改结构体成员只会影响参数的副本,不会影响原始结构体。

    对于按地址传递,函数中直接操作原始结构体的成员,因此可以将set1函数改为使用指针传递结构体:

    #include <stdio.h>
    
    struct Student {
        char name[10];
        int age;
    };
    
    void set1(struct Student *stu) {
        stu->age = 20;
    }
    
    void set2(struct Student stu) {
        stu.age = 20;
    }
    
    int main() {
        struct Student stu = {"Tom", 18};
        set1(&stu);
        printf("%s's age is %d\n", stu.name, stu.age);
        set2(stu);
        printf("%s's age is %d\n", stu.name, stu.age);
        return 0;
    }
    

    这里我们使用了指针传递结构体,函数中可以直接通过指针访问结构体成员,并修改原始结构体的值。

    对于按值传递,函数中修改的是结构体参数的副本,因此不能修改原始结构体。如果需要修改原始结构体,可以改为使用指针传递结构体,在函数中操作指针所指的结构体。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^