有的时候,在使用二级指针和指针的时候会有一些困惑,在这里总结一下.
概念就不多说了,直接进入正题.
结合代码讨论二级指针的问题.
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得到.