来源:知乎
作者:ERYUESANH
题目是什么意思呢?
就是一个函数的输入参数是一个指针,该函数需要改变该指针指向的地址,如:现在有一个全局数组b,现在需要编写一个函数输入参数是一个指针a,需要通过该函数将该指针a指向数组b,即:
intb[3]={1,2,3};voidfcn(参数);voidmain(){int*a;fcn(输入参数a)}
执行完fcn后,使参数的地址改变,这个功能怎么来实现呢?
首先说明结论:使用二级指针。
为了更好的理解这个问题,我们首先来学习一下指针最经典的例子,交换两个数来说明函数的形参和实参之间的关系。
首先来探究以下实参和形参的关系是怎样的。
形参为普通变量类型;
voidtest1(inta,intb){printf("formaladdra:%d,formaladdrb:%d\n",a,b);//打印形参地址printf("formalvaluea:%d,formalvalueb:%d\n",a,b);//打印形参值}intmain(){inta=1,b=2;printf("actualaddra:%d,actualaddrb:%d\n",a,b);printf("actualvaluea:%d,actualvalueb:%d\n",a,b);test1(a,b);return0;}
下面是执行结果:
actualaddra:,actualaddrb:actualvaluea:1,actualvalueb:2formaladdra:,formaladdrbormalvaluea:1,formalvalueb:2
可以看到形参和实参的值虽然相同,但是他们的地址却不相同,所以函数在被调用的时候传入的参数(实参)实际上是被复制到另一个地址(形参地址)中去了,函数中对传入参数的操作实际上是对形参地址中的数进行操作,而与实参无关。所以下面的函数不能实现交换两个数的功能。
voidswap_1(inta,intb){inttemp;temp=a;a=b;b=temp;printf("formaladdra:%d,formaladdrb:%d\n",a,b);printf("formalvaluea:%d,formalvalueb:%d\n",a,b);}intmain(){inta=1,b=2;swap_1(a,b);printf("actualaddra:%d,actualaddrb:%d\n",a,b);printf("actualvaluea:%d,actualvalueb:%d\n",a,b);return0;}
输出如下:
formaladdra:,formaladdrbormalvaluea:2,formalvalueb:1actualaddra:,actualaddrb:actualvaluea:1,actualvalueb:2
可以看到在swap_1函数中a,b两个数的值是被调换了的,但是函数中的a,b的地址和主函数中a,b的地址根本不是同一个,主函数中a,b还是原来的数,所以这个函数起不到交换两个数功能。
既然形参和实参的关系是地址不同而值相同那么我们将实参的地址当作参数传给形参,然后在函数中对形参所指向的地址中的值(该地址就是实参的地址)进行改变是否就可以完成两个数的交换了?
OK!下面我们来编写函数测试以下:
voidswap_2(int*a,int*b){inttemp;printf("formaladdra:%d,formaladdrb:%d\n",a,b);//打印形参地址printf("formalvaluea:%d,formalvalueb:%d\n",a,b);//打印形参的值printf("formaladdrvaluea:%d,formaladdrvalueb:%d\n",*a,*b);//打印以形参值为地址的值temp=*a;*a=*b;*b=temp;printf("formaladdra:%d,formaladdrb:%d\n",a,b);printf("formalvaluea:%d,formalvalueb:%d\n",a,b);printf("formaladdrvaluea:%d,formaladdrvalueb:%d\n",*a,*b);}intmain(){inta=1,b=2;swap_2(a,b);printf("actualaddra:%d,actualaddrb:%d\n",a,b);printf("actualvaluea:%d,actualvalueb:%d\n",a,b);return0;}
结果如下:
formaladdra:,formaladdrbormalvaluea:,formalvaluebormaladdrvaluea:1,formaladdrvalueb:2formaladdra:,formaladdrbormalvaluea:,formalvalueb:formaladdrvaluea:2,formaladdrvalueb:1actualaddra:,actualaddrb:actualvaluea:2,actualvalueb:1
从结果可以看出,这个函数可以交换输入参数的值。下面我们来分析一下为什么这个函数能够实现交换功能。
以变量a为例,首先,从结果的第一行可以看出,传入函数的参数是地址(即实参a的