C语言中二级指针的作用

C语言中不存在引用,所以当你试图改变一个指针的值的时候必须使用二级指针。
1.当不用指针时,参数传入子函数的过程为值传递,子函数中修改的局部变量的值对原来的实参并没有影响。
2.当用一级指针时,参数传入子函数的过程为地址传递,子函数的实际操作是对指针的操作,那就可以通过子函数中对于实参指针的修改达到修改实参的值的目的。
我们通过传递指针来达到修改一个值的目的。那么当你 需要修改一个指针的时候 呢,这个时候我们就需要指针的指针(二级指针):
3.当用二级指针时,是为了修改一个指针
int fun() {
    int *p;
    int m;
    m = init1(&p);
    return m;
}
int init1(int **a) {
    *a = malloc(50);
    return 1;
}
fun()函数通过调用init1()函数实现给p分配内存空间的目的。
p为一个指针,&p就是指向指针p的一个指针(二级指针),
通过把&p传递给init1()函数,此时二级指针a=&p,所以说a是指向指针p的一个指针。
那么对于*a的操作,实际上就是对于指针p的操作,达到了修改指针的目的,这样fun()就可以通过init1()函数来分配内存空间了。
  • 关于值传递

指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。