)
一、引用作用给变量起别名。语法数据类型 别名原名#includeiostreamusingnamespacestd;intmain(){//引用基本语法//数据类型 别名原名inta10;//创建引用intba;coutaaendl;coutbbendl;}通过别名b把b的值进行修改。#includeiostreamusingnamespacestd;intmain(){//引用基本语法//数据类型 别名原名inta10;//创建引用intba;coutaaendl;coutbbendl;b100;coutaaendl;coutbbendl;}二、引用注意事项引用必须初始化引用在初始化后不可改变。(如果b一开始是a的原名后面b就不能再变成c的别名。#includeiostreamusingnamespacestd;intmain(){//引用基本语法//数据类型 别名原名inta10;//创建引用intba;// coutaaendl;// coutbbendl;//2.引用在初始化后 不可以改变intc20;bc;//赋值操作而不是更改引用coutaaendl;coutbbendl;coutccendl;}//输出a20b20c20三、引用做函数参数作用函数传参可以利用引用的技术让形参修饰实参。优点可以简化指针修改实参。1值传递#includeiostreamusingnamespacestd;//1.值传递voidtest01(inta,intb){inttmpa;ab;btmp;coutswap01 aaendl;coutswap01 bbendl;}//2.地址传递voidtest02(int*a,int*b){inttmp*a;*a*b;*btmp;}//3. 引用传递intmain(){inta10;intb20;test01(a,b);coutMain aaendl;coutMain bbendl;}//输出swap01 a20swap01 b10Main a10Main b202地址传递#includeiostreamusingnamespacestd;//1.值传递voidtest01(inta,intb){inttmpa;ab;btmp;coutswap01 aaendl;coutswap01 bbendl;}//2.地址传递voidtest02(int*a,int*b){inttmp*a;*a*b;*btmp;coutswap02 a*aendl;coutswap02 b*bendl;}//3. 引用传递intmain(){inta10;intb20;// test01(a,b);//值传递形参不会修饰实参// coutMain aaendl;// coutMain bbendl;test02(a,b);//地址传递形参会修饰实参coutMain aaendl;coutMain bbendl;}//输出swap02 a20swap02 b10Main a20Main b103引用传递#includeiostreamusingnamespacestd;//1.值传递voidtest01(inta,intb){inttmpa;ab;btmp;coutswap01 aaendl;coutswap01 bbendl;}//2.地址传递voidtest02(int*a,int*b){inttmp*a;*a*b;*btmp;coutswap02 a*aendl;coutswap02 b*bendl;}//3. 引用传递voidtest03(inta,intb){inttmpa;ab;btmp;// coutswap03 a*aendl;// coutswap03 b*bendl;}intmain(){inta10;intb20;// test01(a,b);//值传递形参不会修饰实参// coutMain aaendl;// coutMain bbendl;// test02(a,b);//地址传递形参会修饰实参test03(a,b);//引用传递形参会修饰实参coutMain aaendl;coutMain bbendl;}//输出Main a20Main b10四、引用做函数返回值作用引用可以作为函数的返回值存在的。注意不要返回局部变量引用。用法函数调用作为左值。#includeiostreamusingnamespacestd;//1.不要返回局部变量的引用inttest01(){inta10;//局部变量存放在四区中的栈区returna;}//2.函数的调用可以作为左值inttest02(){}//2.函数的调用可以作为左值intmain(){//引用做函数的返回值//1.不要返回局部变量的引用//2.函数的调用可以作为左值intreftest01();coutrefrefendl;//第一次结果正确因为编译器做了保留。coutrefrefendl;//第二次结果错误因为a的内存已经释放。}//输出ref进程已结束退出代码为-1073741819(0xC0000005)函数的调用作为左值#includeiostreamusingnamespacestd;//1.不要返回局部变量的引用inttest01(){inta10;//局部变量存放在四区中的栈区returna;}//2.函数的调用可以作为左值//返回静态变量的引用inttest02(){staticinta20;returna;}//2.函数的调用可以作为左值intmain(){//引用做函数的返回值//1.不要返回局部变量的引用//2.函数的调用可以作为左值// int reftest01();// coutrefrefendl;//第一次结果正确因为编译器做了保留。// coutrefrefendl;//第二次结果错误因为a的内存已经释放。//如果函数做左值,那么必须返回引用intref2test02();coutref2ref2endl;coutref2ref2endl;test02()1000;coutref2ref2endl;coutref2ref2endl;}ref220ref220ref21000ref21000五、引用的本质本质引用的本质在C内部实现是一个指针常量。#includeiostreamusingnamespacestd;//发现是引用,转换为int * const refavoidfunc(intref){ref1000;//ref是引用,转换为*ref100}intmain(){inta10;//自动转换为 int * const ref; 指针常量是指针指向不可改也说明了为什么引用不可更改。intrefa;ref20;//内部发现ref是引用自动帮我们转换为*ref20couta:aendl;coutref:refendl;func(a);return0;}a:20ref:20六、常量引用作用常量引用主要用来修饰形参防止误操作。在函数列表中可以加const修饰形参防止形参改变实参。#includeiostreamusingnamespacestd;//打印数据函数voidshowValue(intval){val1000;coutvalvalendl;}intmain(){//常量引用//使用场景用来修饰形参防止误操作// int a10;// int refa;//加上const之后编译器将代码修改 int tmp10; const int reftemp;// const int ref10;//引用必须引一块合法的内存空间//// ref20;//加入const之后变为只读不可以修改。inta100;showValue(a);coutmain aaendl;}//输出val1000main a1000引用引用是别名如果修改了引用的值原名的值也随之修改。所以为了避免误操作我们把形式参数设成const也就是只读模式。#includeiostreamusingnamespacestd;//打印数据函数voidshowValue(constintval){// val1000;coutvalvalendl;}intmain(){//常量引用//使用场景用来修饰形参防止误操作// int a10;// int refa;//加上const之后编译器将代码修改 int tmp10; const int reftemp;// const int ref10;//引用必须引一块合法的内存空间//// ref20;//加入const之后变为只读不可以修改。inta100;showValue(a);coutmain aaendl;}val100main a100