二级指针的用法

有的时候,在使用二级指针和指针的时候会有一些困惑,在这里总结一下.

概念就不多说了,直接进入正题.

结合代码讨论二级指针的问题.

1:void test(int a,int b){

int t;

t = a;

a = b;

b = t;

}

int main(){

 int a=10,b=15;

 test(a,b);

}

2.void test(int *a,int *b){

int temp = 0;
int *t=&temp;

*t = *a;

*a = *b;

*b = *t;

}

int main(){

 int a=10,b=15;

 test(&a,&b);

}

3.void test(int *a){

   a=(int*)malloc(100);

}

int main(){

 int *a;

 test(a);

}

4.void test(int **a){

     *a=(int*)malloc(100);

}

int main(){

 int *a=NULL;

int **p=&a;

 test(p);

}

我们知道,函数有自己的作用域,当自动变量超过了函数的作用域就会释放掉,函数的参数是通过复制来传递的.

结合上述观点来看这四种函数.

1.函数复制a,b的值,在函数中交换了a,b的值,函数返回的时候.复制的临时a,b释放掉了,所以,a,b的值并没有交换.

2.函数复制的是a,b的地址.在函数中交换了这个地址指向的值,所以a,b的值被交换.

3.函数复制a的地址,然后分配了一块内存跟复制的a的地址关联,而外部的实参并没有跟这块地址关联,所以当函数结束的时候,形参a释放掉了.实参a依然指向NULL

4.在mian函数中,a指向一个NULL,而p指向a的地址,把p传入函数,复制p的地址.然后p指向的地址依然是a,所以,p解引用之后分配的内存依然跟a做了关联.当函数结束的时候,p的形参释放,分配的地址依然可以通过解引用p得到.

原文地址:https://www.cnblogs.com/weichao975/p/7129106.html