种了几个小时的树,竟然发现自己对指针引用却一窍不通,黯然神伤啊...
遇到的情况
一开始初始化一个root节点赋为NULL,然后是建树,当以先序遍历整棵树输出节点值时,发现树总是空的。开始以为内存没有分配出来,直接调了几小时,才发现是自己不懂得指针引用!这么基础都不懂啊,怎能不叫人心惊胆战……
查漏补缺
很清楚,在传值调用中,改变形参不会影响实参(形参是实参拷贝),如果形参是单指针,可以实实在在地影响实参的值(形参和实参指向同一块堆区)。
虽然单指针形参可以改变堆的值,但是有一样东西是改变不了的——指针的指向。
#include <iostream>
using namespace std;
void test(int *p){
p=new int;
*p=200;
}
int main() {
int *p=NULL;
test(p);
cout << *p << endl;
return 0;
}
我原本以为这样会输出200,但是我错了,程序运行后直接崩溃!虽然在外函数的函数体里面给p指针分配了堆区并赋了值,但是回到主函数之后,p依然是NULL!!!
而在把test函数的声明部分改为:
void test(int *&p);
运行结果就打印出了200。
小结:
如果使用单纯的指针,形参不能改变实参的指向。但如果是指针的引用就不同了,改变了形参的指向,实参的指向也会随之改变。
懂了这个语法再去种树,树理所当然就可以生成了。