先复习一下C语言中,指针的用法
a所在的地址即pa指针变量储存的值,和a改变后的值30
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{ int a; //申请了一个名字为a的变量,开辟了一个地址,并且地址存入a
int *pa=&a; //这里int *表示申请一个指针变量,名叫pa,存入pa变量的值是a的地址
//&a表示获取a变量所在的地址
cout<<pa<<endl; //打印一下pa变量的所存的值,也就是a的地址
*pa=30; //也就是把pa变量所存的地址对应的变量a的存储值替换为30
cout<<a<<endl;
return 0;
}
我们可以认为引用是给一个变量起了一个别名。我们分别写了各种数据类型的引用。
#include <iostream>
using namespace std;
//定义一个枚举ABCD,列举a,b,c,d
enum ABCD{ a,
b,
c,
d,
};
//定义一个结构体Student,包含一个变量score
struct Student{
int score;
};
int main(int argc, char *argv[])
{ int a=1; //定义了一个普通变量a,赋值为1
int &pa=a; //定义了一个引用变量pa,是a的别名
pa=4;
cout<<"int a is "<<a<<endl; //看一下a的值是否改变
enum ABCD i; //定义枚举类型ABCD的枚举变量名字为i
enum ABCD &pi=i; //定义枚举变量i的引用别名pi
pi=c; //为别名变量pi 赋值
cout<<"enum i is"<<i<<endl;
struct Student stu; //命名结构体Student为stu
struct Student &pstu=stu; //结构体变量stu,我们引用变量别名为pstu
pstu.score=100; //为pstu中的score变量赋值100
cout<<"结构体的stu.score is"<<stu.score<<endl;
int c=1; //定义普通变量c
int b=3; //定义普通变量b
int *p=&c; //定义指针变量p,并赋值c的地址
int *&rp=p; //把指针变量p,引用别名rp
//分开看这句代码int *是声明指针变量,&rp是引用变量名rp
rp=&b; //rp的值被覆盖为b的地址
*rp=10; //rp所存地址的变量的值改为10
cout<<"int b changes to"<<b<<endl;
cout<<"rp的地址 is"<<rp<<endl;
cout<<"b的地址"<<&b<<endl;
int list[]={3,4,5}; //创建数组list
int (&Rlist)[3]=list; //给list数组 引用别名Rlist
Rlist[1]=9; //更改数组Rlist中的第二个值
cout<<"第二个值是"<<list[1]<<endl;
return 0;
}
总的来讲,
- 引用可以代表被引用的变量,进行各种操作,也就是对引用变量的操作就是 对被引用变量的操作处理;
- 同时引用变量的声明和赋值是同时的,也就是在声明一个引用变量后就要写明它引用了哪个变量。同时,一但确定不能更改。
#include <iostream>
using namespace std;
//错误的代码
int main(){
int a = 10;
int b = 20;
int &r = a;
int &r = b; //这是违规的操作,不能更改
// 只写&r = b也是错误的
//写成r = b就变成了赋值含义,也是不能改变被引用变量的
getchar();
return 0;
}
但是一个变量可以对应 多个 引用变量
在这里a、ra、rra、rrra、rrrra都是一样的,r…a本质都是a的引用,不存在引用的引用。
还有一个问题,其实引用只是给变量起了一些别名而已,地址并不会更改
我们看一下这个例子
#include <iostream>
using namespace std;
int main(){
int a = 10; //变量a赋值10
int &ra = a; //引用变量ra对应a
int &rra = a; //引用变量rra对应a
int &rrra = rra; //看起来引用变量rrra对应rra,但本质是对应a
int &rrrra = rra;//看起来引用变量rrrra对应rra,本质还是对应变量a
rrra = 3; //给任一个变量赋值
//这里写ra=3,rra=3···都是一样的
cout << a + ra +rrrra <<endl;//打印一下他们相互相加
return 0;
}
需要注意
- 指向引用的指针不存在,因为引用就是被引用变量的别名,上面我们看到了他们的地址都是一样的
- 引用数组也是错误的(
不是上文的数组的引用 这个语言说不清我们上代码吧)
#include <iostream>
using namespace std;
//这是错误的写法
int main(){
int a[] = {10,20};
int &ra[2] = a; //这是错误的写法,
//int (&ra)[2]=a的写法才对
getchar();
return 0;
}
举一个需要引用的例子
比如我们想交换两个变量的值,当然也可以用指针完成
#include <iostream>
using namespace std;
void swap(int *a,int *b){ //x的地址传给指针a, y的地址传给指针b
int c=*a; //指针a所存地址对应变量的值给c
*a=*b; //指针b所存地址对应变量的值
//覆盖指针a所存地址对应变量之前的值
*b=c; //c的值传给指针b所存地址对应变量的值
}
int main(int argc, char *argv[])
{ int x=3;
int y=4;
cout<<x<<" "<<y<<endl;
swap(x,y); //调用函数swap()
//x,y变量的地址传给函数
cout<<x<<" "<<y<<endl;
return 0;
}
#include <iostream>
using namespace std;
void swap(int &a,int &b){ //变量x的引用(别名)是a
//变量y的引用(别名)是b
int c=a;
a=b;
b=c;
}
int main(int argc, char *argv[])
{ int x=3;
int y=4;
cout<<x<<" "<<y<<endl;
swap(x,y); //这里可以不用传地址了!
cout<<x<<" "<<y<<endl;
return 0;
}
#include <iostream>
using namespace std;int main(){
int a = 1;
int &ra = a;
ra = 3*a;//用被引用变量的值的三倍给引用变量赋值
cout << a <<endl;
getchar();
return 0;
}