指针,是C的精髓,但是起码对我来说,实在是很容易搞混弄错的一种存在。以二叉树的几个基本操作为例,来稍微说下指针的含义,做个笔记给以后的自己看
(好吧,还以为markdown跟html差不多,试了几个还是挺多区别的,很多功能都木有)
废话少说,先看代码:
typedef struct BiTNode
{
char data;
struct BiTNode *lchild, *rchild; //左右孩子
}BiTNode,*BiTree;
void CreateBiTree(BiTree &root) //二级指针作为函数参数
{
char ch; //要插入的数据
cin>>ch; //文件头<iostream> 或用scanf读入(cstdio)
if(ch=='#')
root= NULL;
else
{
root=new BiTNode;
(root)->data = ch;
printf("请输入%c的左孩子:",ch);
CreateBiTree(root->lchild);
printf("请输入%c的右孩子:",ch);
CreateBiTree(root->rchild);
}
}
void CreateBiTree(BiTree &root) ,对二叉树的操作与对其他结构体(链表等)类似,即初始化和销毁要用到二级指针,插入、删除、遍历、清空等用一级指针即可。旦&和*的含义会影响到接下来的操作,需要做对应修改。
上面这段传入的形参是以root为一个BiTree(即指向节点BiNode的指针), 传入了BiTree的地址。由于root为指针,所以是可以为空(==NULL)的,new操作时把一个新的节点的地址传回了root。要取root的元素,应用->而不是. 因为它是指针,不是节点。root->lchild是一个指向左孩子(某个节点)的指针,与root等级相同,可以作为形参再次递归调用。(好啰嗦,不可能还看不明白吧。。)
再看这一段:
可以这么理解,要createBiTree,传入的形参是一个二级指针,可以是**root,此时**root是一个BiNode节点,*root是一个指向BiNode的指针,root是一个指向“指向BiNode的指针”的指针,即二级指针。