- 引用变量的创建
在C语言中&表示取地址符号,而在C++中&多了一种不一样的功能,即用来声明一个变量是另外一个变量的别名,例如:
int a;
int & b=a;//b是a的别名
其中&不是地址运算符,而是类型标识符的一部分,是b是a的别名,所谓别名,大家可以把它看做是一个人的小名,比如说一个人叫张三小名叫狗蛋,张三是这个人,狗蛋也是这个人。引用也是这个意思。
举一个程序的例子可以看的更加清晰
#include<iostream>
using namespace std;
int main()
{
int a = 100;
int & b = a;//b是a的别名
cout << " a= " << a ;
cout << " b= " << b << endl;
a++;
cout << " a= " << a ;
cout << " b= " << b << endl;
//打印a和b的地址
cout << " a address = " << &a <<endl;
cout << " b address = " << &b << endl;
system("pause");
return 0;
}
注意下述语句的&不是地址运算符而是将b的类型声明为int &,即指向int变量的引用
int &b =a;
但下述语句中的&是地址运算符,其中&a是a变量的地址
cout << " a address = " << &a <<endl;
cout << " b address = " << &b << endl;
程序的输出结果如下图所示
从中可知a变量的地址和b变量的地址相同,给a++会同时影响两个变量的值。
- 引用和指针的关系
对我们来说引用和指针很像,但是引用和指针还是有着不小的区别,例如我们同时创建一个指向a的指针和引用:
int a=100;
int &b=a;
int *p=&a;
这样a和b还有*p都可以互换,*p是p的解引用表示a的值,而p可以和&b,&a互换,从这里来看引用很像指针,但实际上引用还是不同于指针的,除了表示方法不同,还有其他差别。例如引用必须在声明时初始化,而指针可以先声明后初始化
int a;
int &b;
b=a;
这样的写法是错误的编译器会报警告,所以必须在声明时对引用进行初始化。
引用更接近const指针,必须在创建时初始化,一旦与某个变量关联起来,就无法改变
int &b=a;
实际上相当于
int *const b = a;
其中引用b扮演的角色与*b相同。
引用只能通过初始化来声明设置,不能通过赋值来设置,如果这样做:
int a=100;
int *p=&a;
int &b=*p;
int c=50;
p=&c;
将b初始化为*p使得b指向a,接下来将p指向c并不能改变b引用的是a的事实。
- 将引用作为函数参数
-
引用经常被用作参数,使得函数中变量名作为调用程序中的变量名。 这种传递参数的方法称为引用传递。按引用传递允许被调用的函数访问调用函数中的变量。c语言只能进行值传递,是调用函数的变量的值的临时拷贝。所以c语言使用指针传递。例如:
#include<iostream>
using namespace std;
void swap(int a,int b)
{
int tmp=a;
a=b;
b=tmp;
}
void mswap(int &a,int &b)
{
int tmp =a;
a=b;
b=tmp;
}
int main()
{
int a=2;
int b=3;
swap(a,b);
cout<<" a = "<<a<<" b = "<<b<<endl;
mswap(a,b);
cout<<" a = "<<a<<" b = "<<b<<endl;
system("pause");
return 0;
}
第一个函数swap调用后是对a,b的值拷贝调用函数后不能改变a,b的值不能完成交换,而第二个函数mswap的参数是引用,可以直接改变a,b的值完成操作。