标签(空格分隔): C系列
引用是变量的别名
先来两段珍藏已久的代码:
第一段
#include<iostream>
using namespace std;
void swap(int &a,int &b)
{
int temp=a;
a=b;
b=temp;
}
int main()
{
int a,b;
cin>>a>>b;
if(a<b)
swap(a,b);
cout<<a<<' '<<b<<endl;
return 0;
}
第二段
#include<iostream>
using namespace std;
void swap(int *&a,int *&b)
{
int *temp;
temp=a;
a=b;
b=temp;
}
int main()
{
int a,b;
cin>>a>>b;
int *p=&a,*q=&b;
if(a<b)
swap(p,q);
cout<<*p<<' '<<*q<<endl;
return 0;
}
这两段是刚开始接触C++时自己摸索着写的,但当时理解引用不知道什么是引用,一个人还是费了很大的力气,现在回过来看,简直是,。,。通过第二段代码可以看出,指针和引用就是一个意思—地址。
常规使用
int a=29;
int &b=a;//(1)这句就是把a变量的地址给了b,b现在变成了a的遥控器,b指向的地址就是a的地址,&的意思就是说b就是一个引用。
int * b=& a;//(2)这句话是说b为一个指针,b同样是指向a地址的变量,只不过是指针变量。
b=20;//(1)这里的行为就是修改b指向的地址的变量的值。
*b=20;//(2)修改b指向的地址的变量的值。
cout<<a<<endl;//(1)输出为20
cout<<a<<endl;//(2)输出为20
昨天课堂上老师给出一个“奇奇怪怪的程序”
#include<iostream>
using namespace std;
int a=4;
int &fun(int x) {
a=a+x;
return a;
}
int main() {
int t=5;
cout<<fun(t)<<endl;
fun(t)=20;//先调用再赋值,a=20
cout<<fun(t)<<endl;//输出25,a=25;
t=fun(t);//先调用,再赋值, t=30
cout<<fun(t)<<endl; //输出60(a=60)
return 0;
}
输出结果:
9
25
60
反正我之前是没有见过可以有调用函数的形式做左值的,看来还是要去上课才是真理.
回到宿舍来分析分析。
int &fun(int x) {
a=a+x;
return a;
}
先把这一团看作一个整体。就看做fun(t)做左值时就看做是一个引用变量,引用的是a的地址,不做左值时就是调用函数的语句。这样解释,,。,等于没有解释