c++ 函数参数是引用和二维vector 的要点总结

  1. 函数传参,参数传递引用
1. 引用其实就是一个原有变量的别名而已,同一个变量有两个名字。
2. 引用不是一个全新的变量,不会开辟新的内存空间
3. 操作引用其实等同于操作原有的变量。
#include <iostream>


using namespace std;

void changeNum(int & n){  // int & n = num;
    cout << "里面的num : " << &n <<endl;
    n = 60;
}

int main() {

    int num = 50;

    changeNum(num);

    cout << "外面的num : " << &num <<endl;
    cout << "num : " << num <<endl;

    return 0;
}

打印结果:
里面的num : 00000050A60FFCE4
外面的num : 00000050A60FFCE4
num : 60
  1. 函数传参,参数传递 vector引用
#include <iostream>
#include <vector>


using namespace std;

void changeScore(vector<int> &  nums){
    cout << "inner nums :" << &nums << endl;
    for(int n : nums){
        cout << "inner n :" << &n << endl;
        if(n < 60){
            n = 60;
        }
    }
}

int main() {
    vector<int>  nums {67,78,89,30,88,99};
    changeScore(nums);
    cout << "outside nums :" << &nums << endl;
    for( int n:nums){
        cout << "outside n :" <<&n << endl;
        cout <<"n : " << n <<endl;
    }
    return 0;
}


打印结果:
inner nums :00000064266FF538
inner n :00000064266FF4E4
inner n :00000064266FF4E4
inner n :00000064266FF4E4
inner n :00000064266FF4E4
inner n :00000064266FF4E4
inner n :00000064266FF4E4
outside nums :00000064266FF538
outside n :00000064266FF5A4
n : 67
outside n :00000064266FF5A4
n : 78
outside n :00000064266FF5A4
n : 89
outside n :00000064266FF5A4
n : 30
outside n :00000064266FF5A4
n : 88
outside n :00000064266FF5A4
n : 99

因为函数传参使用的是传递vector 的引用,所以里面的nums,外面的nums是同一个变量,地址是00000064266FF538
基于范围的for循环遍历vector时,int n : nums 相当于重新生成了一个变量n,不断地改变其中的值,相当于拷贝一遍nums遍历的值。所以在函数changeScore中,只是int n 遍历到小于60时,它的值变了,而nums中的值不变。

#include <iostream>
#include <vector>


using namespace std;

void changeScore(vector<int> &  nums){
    cout << "inner nums :" << &nums << endl;
    for(int &n : nums){
        cout << "inner n :" << &n << endl;
        if(n < 60){
            n = 60;
        }
    }
}

int main() {
    
    vector<int>  nums {67,78,89,30,88,99};
    
    changeScore(nums);
    
    cout << "outside nums :" << &nums << endl;
    
    for( int n:nums){
        cout << "outside n :" <<&n << endl;
        cout <<"n : " << n <<endl;
    }
    
    for(int i = 0; i < nums.size(); i++){
        cout << &nums[i] << endl;
    }
    return 0;
}


打印结果:
inner nums :00000010B60FFA28
inner n :000001FBACBC3960
inner n :000001FBACBC3964
inner n :000001FBACBC3968
inner n :000001FBACBC396C
inner n :000001FBACBC3970
inner n :000001FBACBC3974
outside nums :00000010B60FFA28
outside n :00000010B60FFA94
n : 67
outside n :00000010B60FFA94
n : 78
outside n :00000010B60FFA94
n : 89
outside n :00000010B60FFA94
n : 60
outside n :00000010B60FFA94
n : 88
outside n :00000010B60FFA94
n : 99
000001FBACBC3960
000001FBACBC3964
000001FBACBC3968
000001FBACBC396C
000001FBACBC3970
000001FBACBC3974

对比上下文,以及内外遍历nums 中的n 的地址可知,int & n 是 vector nums中的的数据的引用,且vector 的地址跟vector 元素中首元素的地址不一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值