引用和指针
Posted longjiang-uestc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了引用和指针相关的知识,希望对你有一定的参考价值。
引用和指针
引用和指针的区别什么?
什么是引用, 声明和使用引用要注意哪些问题
- 引用简单的理解就是某个目标变量的别名(alias), 对应用的操作与对变量直接操作效果完全相同;
- 声明一个引用的时候一定要对其进行初始化, 引用声明完成后, 相当于目标值有两个完全不同的名称;
- 引用本身不是一种数据类型, 因此引用本身不占用存储单元, 系统也不给引用分配存储单元;
- C++中引用的底层实现;
- 引用在内存中也会分配空间,空间中存放的事被引用变量的地址,因此可以将引用看作为一个常量指针ptr;
- 对引用取地址操作,其实是对被引用变量取地址,编译器将对引用取地址解释为&(*ptr)取地址;
- 更深入的理解是: 引用看作是一个常量指针ptr; 从底层来看, 引用确实占用了内存;
- 本质上,引用和指针没有区别, 只不过在语言层面上,C++设计者将通过指针来操作引用的实现细节隐藏了。不过,我们依然可以肯定:
- 定义一个引用就是定义一个指针,这个指针保存引用对象的地址,且指针类型为const,不可以再指向其他对象;
- 每次对引用变量的使用,实际都伴随着解引用,只是我们看不到符号*, 解完引用就对应着类型的大小;
- 所以内置类型直接传值就ok, 只有copy时需要大量的时间采用引用或指针;
- 理解C++中引用的底层实现
- 本质上,引用和指针没有区别, 只不过在语言层面上,C++设计者将通过指针来操作引用的实现细节隐藏了。不过,我们依然可以肯定:
什么是指针
- 指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;
引用和指针的区别 --- 本质区别是引用是一个别名, 不占内存
- 引用不可以为空,当被创建的时候,必须初始化,而指针可以是空值,可以在任何时候被初始化;
- 可以有const指针, 但是没有const引用, const不能修饰引用;
- 指针可以有多级,但是引用只能是一级;
- 指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;
- 指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了;
- sizeof引用得到的是所指向的变量(对象)的大小,而sizeof指针得到的是指针本身的大小;
- 指针和引用的自增(++)运算意义不一样(指针自加和对象自加);
- 返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄漏, 为什么会发生内存泄漏?
- 如果分配的空间比返回类型的空间大, delete对象后还会剩余一部分空间没有被释放掉, 造成内存泄漏;
引用作为函数参数有哪些特点
- 传递引用给函数与传递指针的效果是一样的;
- 使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;
- 而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;
- 如果传递的是对象,还将调用拷贝构造函数, 因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好;
- 使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"的形式进行运算,这很容易产生错误且程序的阅读性较差;
- 另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰;
以上是关于引用和指针的主要内容,如果未能解决你的问题,请参考以下文章