指针,可以说是c语言最重要也是最难的了。
指针是指向变量的地址,双重指针是指向指针的地址。
当我们使用函数传递指针时,我们只能修该对应地址的值,但我们不能修改指针的地址。所以当我们要修改指针的地址时,我们就要使用当双重指针了,双重指针指向指针的地址。我们用函数代码进行说明吧。
void CreateList (List *L)
{
int n;
scanf("%d",&n);
*L = (List)malloc(sizeof(LNode));
(*L)->next = NULL;
(*L)->flag = 0;
ElemType x;
int i;
for(i = 0;i < n;i++){
printf("Please enter a number:");
scanf("%d",&x);
EnList(*L,i+1,i+1);
}
}
这个函数是用于创建一个新的链表,包含了n个数据,如果我们函数头声明为Create(List L),你会发现,你在这个函数进行的所有操作,主函数的L都不会改变。因为你仅仅是传递了一个指针进来,在函数里面,指针的地址是不能修改的。现在我们再来看看这串代码。
void EnList (List L,ElemType x,int Position)
{
if(Position < 1 || Position - 1 > L->flag ){
printf("Illegal Insert!
");
return;
}
List p = L;
while(Position - 1){
p = p->next;
Position--;
}
List temp = (LNode*)malloc(sizeof(LNode));
temp->data = x;
temp->next = p->next;
p->next = temp;
L->flag++;
printf("L->flag is %d
",L->flag);
}
这个函数的功能是将x插入在链表的第i个位置,为什么同样是传入一个指针,这个也没要返回,为什么L变了呢?因为里面的L->next起了关键作用,里面的L->next也是一个指针,我们对它的修改就是指向下一个结点可以换成*L->next理解,这并不是改变它的地址,等同于在一个函数中,我们传入了一个指针,然后对它进行赋值。所以我们在这个函数能对L链表起到修改的作用。