我复习软件技术基础的单链表时,发现一个很费解的地方:
建立一个空的单链表的函数如下所示:
void initiatesl(node **h) {
*h = (node *)malloc(sizeof(node));
(*h)->next = NULL;
我想问的是,为什么要用二级指针**h,用*h来表达不可以吗?
因为调用该函数会传入指针的地址。
node *h = NULL;
initiatesl(&h);
if(h == NULL)
{
/* 创建失败 /
}
else
{
/ 创建成功 */
}
**h表示指针的指针。内侧的指针指向链表,用来初始化,外侧的指向链表指针,这样才可以把h作为参数传给主程序。
当然,除了用node **h,也可以用node *& h
void main()
{
node *head;
initiatesl(&head);
...
}
在main()中定义的head,是指针变量,要想在initiatesl函数对head赋值,必须将head地址传过去。
就和普通变量int a;要想在其他函数改变a的值,就要把地址传过去一样。