为什么插入列表需要指向指针的指针

dre*_*wyu 4 c pointers

教科书以这种方式描述插入算法,我的问题是,它不能通过第二个函数来完成,如下所示,它不包括指向指针的指针,而是使用*l和l.

void insert (list **l, int d)
{
    list *p; 

    p = malloc(sizeof(list)); 
    p.data = x;
    p.next = *l; 
    *l = p;
}


void insert1 (list *l, int d){
    list *p;
    p = malloc(sizeof(list));
    p.data = x;
    p.next = l;
    l = p; 
}
Run Code Online (Sandbox Code Playgroud)

cma*_*ter 5

一切都是用C中的值传递的.这包括你的指针.所以,当你l = p;在函数结束时说,这对调用者没有影响insert1().你只是修改一个局部变量insert1()(碰巧拿着一个指针).

但是,当您*l = p;在结尾处说时insert(),您正在编写指向由调用者控制的内存位置的指针.调用者通常会执行与此类似的操作:

list* myList = ...;
insert(&myList, ...);
Run Code Online (Sandbox Code Playgroud)

这样,*l = p;直接修改myList调用者的值,允许调用者实际看到效果.