指针和引用的异同点总结
异同点 | 指针 | 引用 |
1 |
指针是一个变量,本身是一个实体,指针中的内容是一个地址值 该值指向内存中的一个存储单元 |
引用只是一个别名,实质上指向同一对象 系统不为引用分配内存 |
2 | 指针可以为空,声明定义时可以不进行初始化 | 引用不可以为空,声明定义是必须绑定到一个变量上 |
3 | 非const指针在初始化后可以重新指向不同的对象,指向其他存储单元 | 引用与被引用对象一旦绑定就不能再更改 |
4 | 指针可以由多级,指向指针的指针,指向指向指针的指针的指针等 | 引用只能有一级,因为不是一个实体,不存在引用的引用 |
5 | 指针的使用过程中需要解引用才能操作指针指向的对象 |
引用本身只是一个别名,对引用的操作即是对原变量的操作, 自增自减是原变量的增减 |
6 |
指针的自增自减是地址的改变,改变了多少根其所指向的类型有关 |
|
7 |
sizeof()得到的是指针本身的大小,一般是4个字节 但当指针是数组名时,sizeof()指的是数组在内存中占用的空间大小 |
sizeof()得到的是原变量的大小 |
8 | 数组不能引用,但数组指针可以引用 | |
9 | 一个变量可以由多个引用,同样一个变量也可以是多个指针指向的对象 | |
10 | void本身不是类型,不能有引用 | |
11 |
指针需要注意内存泄露的问题,因为如果其所指向的内存被释放,需要根据情况将指针的值改为NULL,防止其成为野指针 而引用不存在这样的问题 |
类型标识符 &函数名(形参列表及类型说明) {函数体}
如果定义在类外,&放在类名之前,返回值类型之后
- 以引用做为函数返回值,函数名前加&
- 不产生被返回值的副本
- 函数的返回类型决定函数调用是否为左值,调用一个返回引用的函数得到左值,其他返回类型得到右值,常量引用(对const的引用)不可以被赋值
- 不能返回函数体内new的内存,被函数返回的引用只是作为临时变量出现而没有被赋值给一个实际变量,空间无法释放,会造成内存泄漏
实际操作中采用指针还是引用取决于是否需要考虑“不指向任何对象”或“在不同时间指向不同对象”,如果需要则使用指针,否则就引用。
- 使用引用传递函数参数时,内存中并没有产生实参的副本,直接对实参进行操作,效率高,内存消耗也少。
- 使用指针作为函数参数时,在被调函数中要给形参分配存储单元,内存空间,炳耀重复使用*解引用,易出错且可读性不好,而且在主函数的调用点必须用变量的地址做实参。