目录
什么是引用
我们直接举个例子:
int i = 5;
int& j = i;//声明j是一个整型变量的引用,用整型变量i对它进行初始化
此时j就可以看成是变i的引用,理解为i的别名。经过声明,i与j有相同的作用,相同的数值。
注意:
1.&就不代表地址,而是引用声名符。
2.对变量声明一个引用,并不另外开辟内存单元,即此时i与j占用内存的同一位置。
3.声明引用时,必须立即对它进行初始化。否则出现如下错误。
4.为引用提供的初始化,可以是一个变量或另一个引用:
int i=5;
int& j=i;
int& k = j;
5.指针是通过地址间接访问某个变量,而引用是通过别名直接访问某个变量。因此引用不用写“*”,更加简便。(指针甚至同时需要写&取址符。)
6.一旦引用后,就不能修改引用的值。
int i, k;
int& j = i;
j = &k;//错误,企图重新声明j是整型变量k的引用
7.可以将引用的地址赋给一个指针,此时指针指向的是原来的变量:
int num = 50;
int& ref = num;
int* p = &ref;//p保存的是变量num的地址
不允许用引用的情况:
1.不允许建立void类型的引用,因为void相当于无类型。(下面举例代码就是错误的例子)
void& r = 10;
2.不能建立引用的数组。
int a[4] = "qwer";
int& ca[4] = a;
3.不能进行引用的引用(引用不是一种数据类型),也没有引用的指针。
int n = 1;
int&& r = n;//错误,不能建立引用的引用
int&* p = n;//错误,不能建立指向引用的指针,
引用作为函数参数
使用指针变量作为函数参数设计两个数字交换的函数是可以交换数值成功的。
#include<iostream>
using namespace std;
void swap(int* m, int* n)
{
int temp;
temp = *m;
*m = *n;
*n = temp;
}
int main()
{
int a = 5, b = 10;
cout << "a=" << a << " b=" << b << endl;
swap(&a, &b);
cout << "a=" << a << " b=" << b << endl;
return 0;
}
结果交换成功:
使用引用也可以成功交换:
#include<iostream>
using namespace std;
void swap(int& m, int& n)
{
int temp;
temp = m;
m = n;
n = temp;
}
int main()
{
int a = 5, b = 10;
cout << "a=" << a << " b=" << b << endl;
swap(a, b);
cout << "a=" << a << " b=" << b << endl;
return 0;
}
结果:
其中m,n分别是a和b的别名,对m,n的访问就是对a和b的访问,而不使用指针或引用是无法达到这种效果的。
#include<iostream>
using namespace std;
void swap(int m, int n)
{
int temp;
temp = m;
m = n;
n = temp;
}
int main()
{
int a = 5, b = 10;
cout << "a=" << a << " b=" << b << endl;
swap(a, b);
cout << "a=" << a << " b=" << b << endl;
return 0;
}
结果:
因为只是将main函数中的值传到了swap函数,swap函数调用后恢复原样,没有直接对main函数中的数值做出数值或地址上的影响。
使用引用返回函数值
#include<iostream>
using namespace std;
int a[] = { 1,3,5,7,9 };
int &index(int i)
{
return a[i];
}
int main()
{
index(2) = 25;
cout << index(2);
return 0;
}
输出:
但若将函数的引用符号删去:
#include<iostream>
using namespace std;
int a[] = { 1,3,5,7,9 };
int index(int i)//删除此处引用
{
return a[i];
}
int main()
{
index(2) = 25;
cout << index(2);
return 0;
}
结果:
这是因为不添加引用的话,函数值只能传出不能传入,只传出的话相当于只是一个固定数值,不能够进行修改。(仅为个人理解)