谭浩强C程序设计讲到,如果想交换两个变量a,b的值,我们会这么做:
func(int* a,int* b)
{
int temp;
temp = *a;
*a = *b;
*b = *a;
}
func(&a,&b);
因为C语言单向“值传递”就这样规定的,想改变外部实参a和b的值,你就要传实参的地址才行,没有可理解的,你就是要按照规定来,就像没一个汉字读什么,都是最初的规定者规定的。
指针就有这个特权,当函数参数是一个一重指针的时候,那么传入的就应该是变量的地址。
那么在函数的内部就可以直接通过修改该地址中存放的值。这样就能修改到外部变量的值了。
现在进一步思考,如果函数内部不是修改变量的值,而是指针的值及变量地址的值,又会怎样呢?没错这回就得用到二重指针。
可能有人会问,修改指针的值是想干嘛?修改指针的值的另一种说法就是:
1、将A指针指向另一个B指针变量
1.1 譬如int c=5;int* A=NULL;int *B=c;你现在想将A指向指针B,一般我们直接使用A=B;即可,如果你想封装成函数呢?这时就要传入指针A的地址,才能改变A的指向。
func(int *B,int** A)
{
(*A)=B;
}
void main()
{
int c=5;int* A=NULL;int *B=c;
func(B,&A);//这样其实等同于A=B;你会问为什么一行代码可以解决的还需要函数封装?是为了模块化,是因为这个例子比较简单
}
1.2 如果你形参定义成int *A,传入func(A,B)则无法改变指针A的指向。比如 int* p = a,如果需要将其封装成函数,就会造成在函数中修改指针值的情况。假设一个功能函数需要为指针分配一个新的空间:
func(int* a)
{
a = malloc(10);
}
void main()
{
int* p;
func(p);
}
func(p)执行完了之后