1、为什么会在传参的时候用二重指针呢?
要想弄明白这个问题,先搞清楚为什么传参的时候用指针?
我想很多人都知道直接传值是不会改变实参的值的,只能改变形参的值。所以我们把参数设定为地址,即、传参时用指针,我们就可以改变实参的值。
2、那么考虑一下另外一种情况,我们如果想要改变的实参是一个地址呢?那我们直接把地址值作为形参传进去,函数是不会改变实参(地址值)的。那我们想要改变这个地址值,要怎么办呢?
照葫芦画瓢呗!我们知道指针(地址)也是变量,它也存在一个地址中,所以我们把存指针的地址(二重指针)作为形参传进去,就可以改变指针值了。
3、为什么需要传二重指针呢?
当然是为了改变地址值啦,试想一下,某种情况下,我们要动态申请5个字节的内存
char* p = (char*)malloc(5);
可是过了一段时间发现5个字节不够用了啊。想扩大到10个字节,那怎么办呢?有的人说再申请5个呗。可是我想用一个变量对这10个字节的地址进行访问。。
所以我们可以封装一个函数,用来扩大字节数。
那么这个函数怎么写呢?我想这个函数的逻辑结构是不是应该是这样的:
1、在函数体内申请10个字节, char* q = (char*)malloc(10);
2、把p,这5个字节里面的内容拷贝到q里面,再把q的地址返回去
那么假如我们利用函数参量进行返回(不利用函数类型返回),那么我们需要把传进来的p地址换成q的地址。那么怎么改变实参呢?不就正好是把存p的地址传进去么?!
4、二重指针在单链表中的应用
1、节点定义
2、创建头指针
3、创建单链表
在主函数中创建头指针List,但是是指向NULL,我们希望它指向头结点,在单链表构建函数中,我们malloc一个头结点,并把List的指向改为指向malloc的地址。这样实参就被我们改变了,在主函数中就可以用这个地址进行访问了。
当然你也可以把返回值void改为Linklist,这样利用返回值去指向头结点也可以。