指针是一个内存的地址,引用是一个对象的别名。
指针与引用的区别
0、指针保存的是所指对象的地址;引用是所指对象的别名,没有空间。指针需要通过解引用间接访问;引用可以直接访问。
1、指针可以改变地址,从而改变所指对象;引用不能改变。
2、引用在定义的时候必须初始化;指针在定义时不需要初始化。
3、指针有指向常量的指针和常量指针;引用没有常量引用。
4、指针比较灵活,真正掌握指针的用法才能用的灵活,若用不好还不如不用;引用比指针安全很多,同时也比较死板。
5、引用不能为空;指针可以为空。
6、sizeof(引用)计算的是它引用的对象的大小; sizeof(指针)计算的是指针本身的大小。
7、不能有NULL引用,引用必须与一块合法的存储单元关联。
8、给引用赋值修改的是该引用与对象所关联的值,而不是与引用关联的对象。
9、如果返回的是动态分配的内存或对象,必须使用指针,使用引用会产生内存泄漏。
10、指针传递和引用传递的区别(参考)
-
指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。
值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。
-
引用传递过程中,被调函数的形式参数也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
引用传递和指针传递是不同的,虽然它们都是在被调函数栈空间上的一个局部变量,但是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。而对于指针传递的参数,如果改变被调函数中的指针地址,它将影响不到主调函数的相关变量。如果想通过指针参数传递来改变主调函数中的相关变量,那就得使用指向指针的指针,或者指针引用。