关于指针

指针,可以说是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!\n");
        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\n",L->flag);
}

这个函数的功能是将x插入在链表的第i个位置,为什么同样是传入一个指针,这个也没要返回,为什么L变了呢?因为里面的L->next起了关键作用,里面的L->next也是一个指针,我们对它的修改就是指向下一个结点可以换成*L->next理解,这并不是改变它的地址,等同于在一个函数中,我们传入了一个指针,然后对它进行赋值。所以我们在这个函数能对L链表起到修改的作用。

 

posted @ 2020-10-15 17:44  lookfd  阅读(39)  评论(0编辑  收藏