概念
指针:指针就是一个变量,如果非要说是一个特殊的变量也不为过,因为指针的初始化和解引用等不同的操作方式而已。就内存的分布来说,指针和一个变量在内存中存放是没有任何区别的,无非指针存放的是变量的地址。
传值:传值无非就是实参拷贝传递给形参,单向传递(实参->形参),赋值完毕后实参就和形参没有任何联系,对形参的修改就不会影响到实参。
传地址:为什么说传地址也是一种传值呢?因为传地址是把实参地址的拷贝传递给形参。还是一句话,传地址就是把实参的地址复制给形参。复制完毕后实参的地址和形参的地址没有任何联系,对实参形参地址的修改不会影响到实参, 但是对形参地址所指向对象的修改却直接反应在实参中,因为形参指向的对象就是形参的对象。
传引用:传引用本质没有任何实参的拷贝,一句话,就是让另外一个变量也执行该实参。就是两个变量指向同一个对象。这是对形参的修改,必然反映到实参上。
1、传值传的是原来实参的一份拷贝,对形参进行操纵不会改变实参的值,函数返回后,函数栈帧销毁,这份拷贝也会自动被回收
2、传指针就是为实参创建一个指针变量,指针变量里面存的就是实参的地址,对形参进行操作也会通过指针的间接访问对实参进行修改,所以对形参的操作会影响原来的值
3、传引用什么也没创建,只是给实参取了个别名,就像同学之间取外号一样,张三是这个同学,铁蛋也是这个同学,两个名字可是指的就是一个人,对引用进行操作就等于对实参的操作,对引用的操作会影响原来的实参
下面来看一下指针和引用的区别?
(1)非空区别
在任何情况下都不能使用指向空值的引用,一个引用必须总是指向某个对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你就可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针要高
(2)合法型区别,
在使用引用之前不需要测试它的合法性。相反,指针则应该总是被测试,防止其为空。
(3)可修改区别
指针与引用的一个重要区别是指针可以被指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指向的对象,以后不能改变,但是指定的对象其内容可以改变
(4)应用区别
在以下情况下使用指针:一是考虑存在不指向任何对象的情况(这种情况下,能够设置指针为空),二是需要能够在不同时刻指向不同的对象(在这种情况下,你能改变指针指针的指向)如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么应该使用引用。
(5)其他区别
1)引用在定义时必须初始化,指针没有要求
2)没有NULL引用,只有NULL指针
3)在sizeof中含义不同,引用是引用类型的大小,指针始终是地址空间的字节大小
4)引用自加改变变量的内容,指针自加改变了指针的指向
5)有多级指针但没有多级引用
6)引用比指针用起来相对更安全
简而言之
可以得出结论,如果穿引用将会改变变量最初的值,而如果传值在函数中使用后并不会改变其原来的值