变量名本身是一段内存的引用,即别名(alias)。此处引入的引用是为己有变量起一个别名。声明如下12345intmain(){inta;intb a;}1.规则1.引用没有定义是一种关系型声明。声明它和原有某一变量的关系。类型与原有类型保持一致且不分配内存。与被引用的变量有相同的地址。2.声明的时候必须初始化一经声明不可变更。3.可对引用再次引用。多次引用的结果是某一个变量具有多个别名。4.符号前面有数据类型时是引用。其他均为取地址。1234567891011#include iostreamusingnamespacestd;intmain(){inta,b;intr a;intr b;//错误不可更改原有的引用关系floatrr b;//错误引用类型不匹配coutarendl;//变量与引用具有相同的地址。intra r;//可对引用更次引用表示 a 变量有两个别名分别是 r 和 ra}2.应用1.值作函数参数12voidswap(inta,intb);//无法实现两数据的交换voidswap(int*p,int*q);//开辟了两个指针空间实现交换2.引用作函数参数123456789101112131415#include iostreamusingnamespacestd;voidswap(inta,intb){inttmp;tmp a;a b;b tmp;}intmain(){inta 3,b 5;couta ab bendl;swap(a,b);couta ab bendl;return0;}c中引入引用后可以用引用解决的问题。避免用指针来解决。3.引用提高引用的本质是指针C对裸露的内存地址(指针)作了一次包装。又取得指针的优良特性。所以再对引用取地址建立引用的指针没有意义1.可以定义指针的引用但不能定义引用的引用。12345inta;int* p a;int* rp p;// okint r a;int rr r;//error例子123456789101112131415161718192021222324252627282930313233343536#include iostreamusingnamespacestd;voidswap(char*pa,char*pb){char*t;tpa;papb;pbt;}voidswap2(char**pa,char**pb){char*t;t*pa;*pa*pb;*pbt;}voidswap3(char*pa,char*pb)//指针的引用{char*t;tpa;papb;pbt;}intmain(){char*pachina;char*pbamerica;coutpapaendl;coutpbpbendl;//swap(pa,pb);//swap2(pa,pb);swap3(pa,pb);coutpapaendl;coutpbpbendl;return0;}2.可以定义指针的指针不能定义引用的指针。12345inta;int* p a;int** pp p;// okint r a;int* pr r;// error3.可以定义指针数组但不能定义引用数组可以定义数组引用。12345inta, b, c;int* parr[] {a, b, c};// okint rarr[] {a, b, c};// errorintarr[] {1, 2, 3};int(rarr)[3] arr;// ok4.常引用const 引用有较多使用。它可以防止对象的值被随意修改。因而具有一些特性。(1)const 对象的引用必须是 const 的将普通引用绑定到 const 对象是不合法的。这个原因比较简单。既然对象是 const 的表示不能被修改引用当然也不能修改必须使用 const 引用。实际上const int a1; int ba;这种写法是不合法的编译不过。(2)const 引用可使用相关类型的对象(常量,非同类型的变量或表达式)初始化。这个是const 引用与普通引用最大的区别。const int a2;是合法的。double x3.14; const intbx;也是合法的。4.常引用原理const 引用的目的是禁止通过修改引用值来改变被引用的对象。const 引用的初始化特性较为微妙可通过如下代码说明123456doubleval 3.14;constintref val;// int const int const ??double ref2 val;coutref ref2endl;val 4.14;coutref ref2endl;上述输出结果为 3 3.14 和 3 4.14。因为 ref 是 const 的在初始化的过程中已经给定值不允许修改。而被引用的对象是 val是非 const 的所以 val 的修改并未影响 ref 的值而 ref2 的值发生了相应的改变。那么为什么非 const 的引用不能使用相关类型初始化呢实际上const 引用使用相关类型对象初始化时发生了如下过程12inttemp val;constintref temp;如果 ref 不是 const 的那么改变 ref 值修改的是 temp而不是 val。期望对 ref 的赋值会修改 val 的程序员会发现 val 实际并未修改。12345inti5;constint ref i5;//此时产生了与表达式等值的无名的临时变量//此时的引用是对无名的临时变量的引用。故不能更改。coutrefendl;5.const的好处1使用 const 可以避免无意修改数据的编程错误。2使用 const 可以处理 const 和非 const 实参。否则将只能接受非 const 数据。3使用 const 引用可使函数能够正确的生成并使用临时变量如果实参与引用参数不匹配就会生成临时变量6.引用的本质浅析1.大小与不可再引用1234567891011121314151617structTypeP{char*p;};structTypeC{charc;};structTypeR{char r;//把引用单列出来不与具体的对象发生关系};intmain(){printf(%d %d %d\n,sizeof(TypeP),sizeof(TypeC),sizeof(TypeR));return0;}结论引用的本质是是对常指针 type * const p 的再次包装。1231、constint*pi 指向常量的指针。2、int*const pi 指针本身是一个常量称为“指针常量”、“常指针”。3、constint*const pi 指向常量的指针常量。总结本篇文章就到这里了希望能够给你带来帮助