C++引用和指针
C++引用和指针
一、引用的概念和用法
1、引用的概念:
引用不是定义一个新的变量而是给一个已经定义过的变量起一个别名。
2、用法:
定义的格式为:
类型& 引用变量名=已定义过的变量名;
如:
其运行结果如下:
3、引用的特点:
①一个变量可以取多个别名;
②引用必须初始化;
③引用只能在初始化的时候引用一次,不能改变为在引用其他变量;
如:
其运行结果为:
3、const引用
可以通过普通引用改变变量的值 ,但是不能用const引用改变变量的值。
如以下代码:
其运行结果为d2 = 5;
再来看下一段代码:若给const修饰的d2赋值编译器会报错,不能给常量赋值
若改为如下代码就不会出错。const引用可以引用被const修饰的变量,同时只有常引用可以引用常量。
其运行结果d4=d3=3;d6=7。
Const引用还有另外一种应用场景,就是存在隐式类型转换的引用必须用const来修饰,代码如下:
如上代码所示未被const所修饰的double定义的f在引用a时会生成临时变量,临时变量具有常性,所以不能给f赋值,用const修饰该引用就会解决上述问题。
二、引用做参数
使用引用传参,传入的是实参本身,不会为形参在栈上分配内存。
如下代码所示:
其输出结果为a=10,b=5;
而在没有使用引用的swap函数其代码如下:
其结果为a=5;b=10;并没有实现两个数的交换。
三、引用做返回值
下边看一个例子:
1、传值返回
2、传引用返回
代码如下:
用传引用返回不会生成临时变量,这样定义相当于给c起了一个别名,然后将这个值保存下来赋给ret。这样做比传值的效率高,更加简单直观。
四、汇编层看引用特性
将上述传值返回与传引用返回汇编,观察得到以下两种情况:
得出以下两种结论:
1、不要返回一个临时变量的引用。
2、如果返回对象出了当前函数的的作用域依旧存在,则最好使用引用返回。
五、引用和指针的区别
1、引用只能初始化一次,之后不能改变指向其他变量,而指针变量的值可以变;
2、引用必须指向有效的变量,而指针可以为空;
3、Sizeof引用对象和指针对象的意义不相同,sizeof引用得到的是所指向变量的大小,而sizeof指针得到的是对象地址的大小;
4、指针和引用自增自减意义不相同;
5、相比较而言引用比指针更安全;
最后总结如下:
指针比引用更灵活,但是更危险,使用指针时,一定要检查指针是否为空,指针所指的地址释放后最好置零,否则可能会出现野指针的问题。