一级指针与二级指针的适用场景

在函数中,一级指针只能访问一级指针指向的内容,不能对一级指针的指向进行改变。

例如:

void test(int* p)

{

        int* b;

        p=b;

}

int main()

{

       int* pa=NULL;

       test(pa);

       printf("%s",pa);

打印出来的是NULL;

p只是pa的一份临时拷贝,p与pa的地址是不一样的。只是里面的内容一样。当p的内容改变的时候(就是p的指向改变的时候) ,退出函数会销毁里面的内容。所以pa还是NULL;

想要改变p的指向并且传出去,那么就需要用到二级指针。二级指针指向一级指针的地址。就是把一级指针的地址当作二级指针的内容。

假设main函数中一级指针p的地址为0x1543

test(&p);//传一级指针的地址

void test(int** pp); 用二级指针接收一级指针的地址,也是临时拷贝内容(一级指针的地址)一样,二级指针地址不一样的临时变量。

在test函数中*pp(得到一级指针的地址)就可以找到p那一块地址,间接操作p中的内容。

我之前的想法:

在函数中完成两个数的交换的时候就是传一级指针就可以改变a,b的值。为什么现在需要二级指针才可以完成呢?

其实两者也有共同的地方:

传参时: test1(&a,&b);//a,b是int类型

               test3(&p);//p是一级指针

都是传地址,才可以真正意义上改变a,b,p的值。

&a,&b用一级指针来接收,对一级指针进行操作可以改变(int类型的内容)

&p用二级指针来接收,对二级指针进行操作可以改变一级指针的指向(一级指针的内容)

其实他们两者大同小异。

目前我遇到的问题:

对于有哨兵位(带头)的申请和插入操作,为什么申请的时候是用void LTInit(LTNode** pphead);//二级指针

插入时void LTPushBack(LTNode* phead);//一级指针

首先要明白:哨兵位(带头)是不能删除,只能改变指向。

在申请的时候,需要一级指针,一开始指向NULL,后来需要指向哨兵位(改变一级指针的指向,就需要用到二级指针了)。之后这个一级指针就不用动了。所以需要传二级指针(相当于传址操作)

在插入的时候,只需要用一级指针,找到哨兵位,而不需要改变一级指针的指向。所以传一级指针(相当于传值操作)

你可能感兴趣的:(笔记,经验分享,c语言,其他)