通过面试题,让我纠正了很多之前的错误概念,也有了一些新的想法。不知是否正确,如有不足,欢迎大家的批评指正。
我们在学习函数时,老师会说传进函数的实参值不会改变,如果想要改变,可以传递指针,通过指针改变实参值。那如果我想改变指针的值呢,我们需要向该函数传递指针的指针,即二级指针。
题7就体现了这种思想。
如题,结果为 1 3 1 1,原本指向b的q却似乎指向了a,为什么呢,让我们来看swap函数,进入函数如图1,3行代码执行之后,结果如234。最终q指向了a。通过二级指针成功的改变了一级指针的值,即让指针的指向改变。
那么,为什么我们需要这样做的呢?
回到最初老师的课堂,老师一定说过,是实参到形参是值传递,我理解为函数的形参是实参值的拷贝,那么对于拷贝无论怎么操作都不会影响原来的实参。而指针实现了地址传递,使我们直接通过地址改变实参的值。但是指针传递时也是进行了拷贝。
提到指针传递,就想到另一个很容易迷糊的问题,数组名是指针吗?我之前一直理解为数组名即指针,但并不准确,数组名是一个指针常量,不能作为左值。数组作为实参不能将其全部数据拷贝,只能将其首地址,即数组名拷贝,所以在传递时数组退化为指针。
回到最初的,我一直疑惑的问题,为什么实参不会改变,为什么数组退化为指针,都因为函数的形参是实参的拷贝,而数组无法被完全拷贝,则拷贝了其首地址。