仅作为参考、记录
函数如果直接传递指针,如调用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;
}
解决无法对传入的指针修改的问题
- 使用引用可对传入的实参进行修改
//使用引用可对传入的实参进行修改
Status Init_LinkList(Linklist *&l){
l=new Linklist ;
l->next=NULL;
return OK;
}
- 返回修改后的指针类型
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语言指针作为函数参数传递学习(一)