问题
今天刷leetcode的时候做到一道构造二叉树类型的题,发现算法写的没问题但是执行的返回总是为空,函数没有改变我传入的指针参数。原因是我传入的指针,并不是通过这个指针去修改其指向的内容,而是修改了这个指针的指向!然而我的参数传入方式是传值,因此传入的其实是指针的副本,而后函数中改变了这个副本的指向,但是最后退出函数的时候,调用函数中的指针其实是没有改变的。因此只能对指针也进行引用传递:
TreeNode *&root
引用
引用是在C++中引入的,原始的C是只能通过传地址来实现的; 我们通常的参数传入都是传值方法,是被调用函数使用调用程序值的拷贝!
引用其实是对变量创建一个别名:
int rats;
int & rodents = rats //将rodents作为rats的别名
要注意区别引用&和地址运算符&!
引用和指针的区别我认为和Linux中硬链接和软链接的区别很类似,而且引用和指针的一个重要区别是,声明引用的时候必须将其初始化,而指针不需要!
在上面问题中讨论到的,若是指针的传值传入,则是拷贝了原指针的值获得一个副本,尽管在函数内部可以对这个副本指针的指向进行改变,但是无法改变原指针的指向!除非传入的是这个指针的地址!
效率
传值需要对参数进行拷贝,相对来是耗时一些,在C++中使用传引用有利于提高效率