一、引用的用途
1、变量的引用是变量的别名,与变量占用同一段内存空间,引用在定义时需要初始化,不能为空。
在函数内部使用
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
int a = 5;
int &ra(a);
ra = 3;
cout << a <<endl;
return 0;
}
输出3,ra 和 a是一个东西。
2、引用作为参数传递
#include <iostream>
#include <stdlib.h>
using namespace std;
void change(int &a)//新建一个变量接收实参
{
a = 19;
}
int main()
{
int a = 5;
change(a);
cout << a <<endl;//19
return 0;
}
3、引用作为返回值#include <iostream>
#include <stdlib.h>
using namespace std;
int &get()
{
int a = 10;//栈
int &ra = a;
return ra;
}
int main()
{
int &ra = get();
cout<<ra<<endl;//10
cout<<ra<<endl;//1529137864,不能返回栈上的东西,但可以返回栈上指向的值
return 0;
}
二、引用与指针
1、通过引用改变指针的指向
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
int num1(5),num2(10);
int *pnum(&num1);
cout<<*pnum<<endl;//5,指向num1的指针
int *&rpnum = pnum;//*&顺序不能变
rpnum = &num2;
cout<<*pnum<<endl;//10 指向num2的指针
return 0;
}
2、引用改变指针指向的值
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
int num1(5),num2(10);
int *pnum(&num1);
cout<<*pnum<<endl;//5
int *&rpnum = pnum;
*rpnum = 100;
cout<<*pnum<<endl;//100
return 0;
}
三、高级引用
1、引用一维数组
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int (&ra)[10](a);
for(int i = 0; i < 10; i++)
{
cout<< ra[i] <<endl;
}
return 0;
}
2、二维数组的引用
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
int a[2][5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int (&ra)[2][5](a);//二维数组的引用
for(int i = 0; i < 2; i++)
{
for(int j = 0; j < 5; j++)
{
cout<<" "<<ra[i][j];
}
cout<<endl;
}
return 0;
}
3、引用函数指针
#include <iostream>
#include <stdlib.h>
using namespace std;
int jia(int a, int b)
{
return a+b;
}
int jian(int a, int b)
{
return a-b;
}
int main()
{
int (*p)(int a, int b)(jia);//定义一个函数指针
cout<<p(1,2)<<endl;//3
int (*&rp)(int a, int b)(p);//定义一个函数指针的引用
rp = jian;//此处不能用括号,括号仅适用于初始化
cout<<p(1,2)<<endl;//-1
return 0;
}
4、函数指针当做函数的参数
#include <iostream>
#include <stdlib.h>
using namespace std;
int jia(int a, int b)
{
return a+b;
}
int jian(int a, int b)
{
return a-b;
}
void change(int (*&rp)(int, int))//函数指针当做函数的参数
{
rp = jian;
}
int main()
{
int (*p)(int a, int b)(jia);//定义一个函数指针
cout<<p(1,2)<<endl;//3
change(p);
cout<<p(1,2)<<endl;//-1
return 0;
}
5、右值引用作用:节约拷贝内存的时间,是内存优化所必须的。6、常量的引用
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
char str[10]("hello");
const char(&rstr)[10](str);
str[2] = 'y';//可以
//rstr[2] = 'y';//不可以,相当于指向常量的指针,只能读,不能写
const char(&rrstr)[10](rstr);//可以,引用可以给另一个引用初始化
return 0;
}
7、限定一个函数指针是常引用
#include <iostream>
#include <stdlib.h>
using namespace std;
int jia(int a, int b)
{
return a+b;
}
int jian(int a, int b)
{
return a-b;
}
int main()
{
int (*p)(int a, int b)(jia);//定义一个函数指针
cout<<p(1,2)<<endl;//3
int (*const &rp)(int a, int b)(p);//注意const的位置
//rp = jian;//不可以
return 0;
}