什么是引用
在C++语法上来看,引用是给变量起了个别名,不占用空间
引用的格式
类型& 引用变量名 =引用实体
引用的注意事项
1.引用定义的同时必须进行初始化
引用是给变量起别名,那前提肯定得有实体变量
2.引用不能初始化为空
引用是给变量起别名,给空起了个别名没意义
3.不可以改变引用关系
这与引用的实质有关系
引用的实质是一个指针常量,是一个指向方向固定的指针,所有它不能更改指向,也就不能改变引用关系
int& b=a; int* const b=&a;
#include <iostream> using namespace std; int main() { int a = 5; int& b3;//引用必须初始化 int& b2 = NULL;//引用不能初始化为空 int& b1 = a; int* const b1 = &a;//本质 -->指针常量(指向不能改变,但是指向内存空间里面的内容可以改变)n cout << b1 << " " << *b2; return 0; }
预备知识
左值
可寻址、有变量名的值
右值
不可寻址、一般没有变量名的值
左值引用
int a=10;//a为左值 有变量名 可寻址(&x)可以找到地址 int& b=a;
右值引用
#include <iostream> using namespace std; int main() { int&& c = 10;//10为右值 不可寻址(&10错误) return 0; }
万能引用
const 类型 引用名 =引用实体
int main() { const int a = 10; const int& b = a; const int& c = 10; return 0; }
引用的应用
做函数的形参
参数的传递方式有三种
值传递
址传递
引用传递
#include <iostream> using namespace std; void text1(int a,int b) { int t; t = a; a = b; b = t; }//值传递 void text2(int*a,int*b) { assert(a); assert(b); int t; t = *a; *a = *b; *b = t; }//址传递 void text3(int& a,int& b) {//int& a=a; int& b=b; int t; t = a; a = b; b = t; }//引用传递 void text4(int* const a,int* const b) {//int* const a=&a; int* const b=&b; int t; t = *a; *a = *b; *b = t; } int main() {//引用做函数的形参 可以修改传递过来实参变量的值 int a = 5; int b = 10; text1(a, b);//值传递 text2(&a,&b);//址传递 text3(a,b);//引用传递 text4(&a,&b); return 0; }
优点
指针要判空的,但是引用不用 可以避免很多麻烦
引用做函数的返回值
本人没太听懂。。。。。。
引用与指针的区别
1.引用必须进行初始化,但是指针可以不初始化,为野指针
2.引用不用初始化为空,但是指针可以初始化为空,为空指针
3.引用与变量的关系不能改变,但是指针的指向确可以改变
4.引用所占的空间大小为 类型大小所对应的字节,而指针4/8Byte
#include <iostream> using namespace std; int main() { int a = 10; int& b = a; int* c = &a; cout<<"引用的大小:" << sizeof(b)<<endl<<"指针变量的大小:"<<sizeof(c)<<endl; return 0; }5.没有多级引用,但是有多级指针,二级三级指针
6.引用的++是指别名所在的那段空间数据的++,而指针的++是指向的移动