指针和引用的区别:
- 从本质上看,指针是地址,引用是别名;
- 从现象上看,指针可以在运行时改变其所指向的值,而引用则总是指向在初始化时被指定的对象不能改变;
- 从内存分配看,程序为指针变量分配内存区域,而不为引用分配内存(所以引用申明时必须初始化,指向一个已经存在的对象);
- 对指针的级数没有限制,但是引用只能是一级:
int** p1; //合法,指向指针的指针
int*& p2; //合法,指向指针的引用
int&* p3; //非法,指向引用的指针是非法的
int&& p4; //非法,指向引用的引用是非法的
即:指向指针的引用是合法的,指向引用的指针是非法的!
指针参数和引用参数
对于函数参数,什么时候使用引用、什么时候使用指针、什么时候按值传递,下面是一些指导原则:
- 对于使用传递的值而不作修改的函数:
- 数据对象很小,如内置类型或小型结构,则按值传递;
- 数据对象时数组,则使用指针(这是唯一的选择),并声明为const;
- 数据对象是较大的结构,则使用const指针或const引用,以提高效率;
- 数据对象是类对象,则使用const引用。
- 对于修改调用函数中数据的函数:
- 数据对象是内置数据类型,则使用指针;
- 数据对象是数组,则只能使用数组;
- 数据对象是结构,则使用指针或引用;
- 数据对象是类对象,则使用引用。