仅作为参考、记录

函数如果直接传递指针,如调用Init_LinkList(L)l的初始指向为NULL,对l进行赋值,l指针不在指向NULL,而是指向new LinkList 后的地址,但是无法对传入的实参进行修改,L仍然指向NULL

这里指针的传递仍然为值传递

//初始化链表
Status Init_LinkList(Linklist *l){
   

    l=new Linklist ;
    l->next=NULL;
    return OK;
}

解决无法对传入的指针修改的问题

  1. 使用引用可对传入的实参进行修改
//使用引用可对传入的实参进行修改
Status Init_LinkList(Linklist *&l){
   

    l=new Linklist ;
    l->next=NULL;
    return OK;
}
  1. 返回修改后的指针类型
Linklist Init_LinkList(Linklist *l){
   

    l=new Linklist ;
    l->next=NULL;
    //这里返回指针
    return l;
}

完整代码

//main函数
#include <iostream>

typedef  int ElemType ;
typedef bool Status ;

#define OK true
#define ERROR false

typedef struct node{
   
    ElemType data;
    node *next;

}Linklist;

/** * 初始化 */
Status Init_LinkList(Linklist *l){
   
    printf("pre_addr:%p\n",l);
    l=new Linklist ;
    printf("arf_addr:%p\n",l);
    l->next=NULL;

    return OK;
}
/** *向单链表中插入数据 * @param l * @param i i从1开始 * @param e * @return */
Status Insert_LinkList(Linklist * &l,int i, ElemType e){
   
    Linklist *tem=l;
    int j=0;
    while (tem&&j<i-1){
   
        j++;
        tem=tem->next;
    }
    //找到插入的位置
    //单链表插入
    //前插入
    if(i==j){
   
        node *AddNode=new Linklist ;
        AddNode->data=e;
        AddNode->next=tem->next;
        tem->next=AddNode;
    }else{
   
        //找不到插入的位置
        return ERROR;
    }

    return OK;
}

void print_LinkList(Linklist *&L){
   
    Linklist  *tem=L;
    int i=0;
    while (tem->next!=NULL){
   
        printf("%d:%d ",i++,tem->next->data);
        tem=tem->next;
    }
}


int main() {
   
    Linklist  *L =NULL;
    printf("addr:%p\n",L);
    Init_LinkList(L);
    printf("Inited_addr:%p\n",L);
    if(Insert_LinkList(L,0,12)){
   
        print_LinkList(L);
    }else{
   
        printf("插入数据失败");
    }



    std::cout << "Hello, World!" << std::endl;
    return 0;
}


这位博主的解释可能会比较清楚
参考:C语言指针作为函数参数传递学习(一)