引用
1、什么是引用
引用就是一种取别名的机制
为什么要使用指针:
①跨函数进行共享变量(输出型参数),引用可替代
②提高传参效率,引用可替代,效率比指针还高,不拷贝字节
③配合堆内存使用,只能使用指针
④配合字符串使用,string类可以替代
2、引用使用格式
类型名& 别名 = 数据;
3、什么情况下使用引用
①跨函数共享变量,引用比指针更安全(无需直接操作地址空间、不存在空引用,也极少出现野引用问题)、也比指针更方便(无需取地址、解引用)
②提高传参效率,引用的效率比指针还高,指针最起码还要传递4/8字节的地址编号,但是引用一个字节都不需要传递,但是引用和指针一样都有被修改的风险,因此为了保护目标需要增加const
4、使用引用需要注意的问题
①引用必须初始化,所以不存在空的引用
②可以引用右值,但是必须使用const修饰引用
const int& n = 10;
③引用不能中途更改引用的目标
④函数的返回值类型可以是引用类型,但是不能返回局部变量的引用
int& func(void) // false
{
int num = 10;
return num;
}
int& func(void) // true
{
int* num = new int(10);
return *num;
}
指针与引用的相同点和不同点
相同点:
①都可以跨函数共享内存,都可以提高函数的传参效率、也需要const保护
②可以定义数组指针,也可以定义数组引用
int arr[5] = {1,2,3,4,5};
int (*arrp)[5] = &arr;
int (&hehe)[5] = arr;
③可以定义函数指针,可以定义函数引用
void (*fp)(void) = func;
fp();
void (&xixi)(void) = func;
xixi();
不同点:
①引用是一种取别名的机制,指针是一种数据类型
②引用不需要额外的存储空间,指针需要至少4/8字节用于存储内存地址
③指针可以不初始化,引用必须初始化
④指针有空指针,但没有空引用
⑤指针可以更改指向的目标,但引用不可以
⑥指针可以配合堆内存使用,而引用不行
⑦可以定义指针数组,但不能定义引用数组