- 函数传参,参数传递引用
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
- 函数传参,参数传递 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 元素中首元素的地址不一样。