在面试过程中,C语言和C++的区别总是面试官的侧重点,而指针和引用更是容易被问到,指针和引用的区别很简单,但很少有人能有全面的,有层次有条理的回答这个问题,所以有条理的总结归纳就显得尤为重要。
先来了解什么是指针,什么是引用
指针:存储内存中某一块空间地址的变量。
引用:引用不是定义一个新变量,而是给一个已经定义的变量起一个新的别名。
定义的格式:
指针:类型 *变量名 = 已有变量地址(&已定义过的变量名)
引用:类型 &引用变量名 = 已定义过的变量名
特点:
指针:1.一个指针只能指向一块空间
2.指针可以不初始化(不过不建议不初始化)
3.指针可以在初始化的时候指向一个变量,但在之后使用时可以改变它的内容
4.sizeof指针时得到的是所指向对象地址的大小
5.指针自加自减,是指针所指向对象的地址自加自减一个类型大小
引用:1.一个变量可取多个变量名
2.引用必须初始化
3.引用只能在初始化的时候引用一次,不能再改变引用其他的变量
4.sizeof引用得到的是所指向变量的大小。
5.引用自加自减,是引用对象的值自加自减
const修饰的指针和引用:
指针:const修饰指针,指针不能改变,指针指向的内容可以改变。
引用:1.常量具有常性,只有const修饰的常引用才能引用常量
2.const修饰引用,引用内容不能改变
3.不能给不同类型的引用赋值,例如将一个double类型的变量d赋值给一个int类型的引用i,就不能编译通过。因为赋值时会生成一个临时变量。d引用的是这个带有常性的临时变量,所以不能赋值。
作为参数:
1.值传递:如果形参为非引用的传值方式,则生成局部临时变量接收实参的值。
2.引用传值:如果形参为引用类型,则形参是实参的别名(当不希望函数内改变参数x的地址时,尽量采用常引用传参)。
3.指针传参:如果形参为指针类型,则生成匿名对象接收地址
总结:
1.不要返回一个临时变量的引用。
2.如果返回对象除了函数的作用域依然存在,尽可能使用引用。
3.指针比引用更灵活,但是也更危险,使用指针时要先检查指针是否为空,指针指向的地址释放后最好置0,否则可能存在野指针问题。
如果还有什么没有考虑到的地方欢迎大家指出来!!