void func (int a,int *pfunc)
{
a=20;
*pfunc=50;//pfunc是指针,*是解引用操作,作用是改变pfunc地址里面的数值
printf("形参a=%d\n",a);
}
int main()
{
int a=10;
int b=30;
int*p=&b;
func (a,p);
printf("实参a=%d,经过指针修改后b=%d",a,b);
return 0;
}
经过运行后输出为形参a=20
实参a=10,经过指针修改后b=50
我们可以发现程序运行后,main函数里的a的值并未发生改变,但是b的值改变了,这是为什呢?
对于我们的普通形参变量,在函数调用时我们只是简单的将实参的值复制了一份给形参,形参拿到的只是实参的值,形参并不知道实参来自哪里,它只是老老实实的接受一个值而已,等到函数调用完成,形参就没了,实参丝毫不受影响。
可是对于指针形参变量来说,实参给形参的是实参的地址,形参可以根据地址“上门服务”,一旦函数调用,形参就根据地址找到实参的“老家”,然后通过解引用开始改变数值。函数调用结束形参指针就没了,但是实参的修改是是不可逆的。
举一个是个中国人都觉得恰当的例子
形参指针是东风导弹,实参指针是日本富士山。进行函数调用时,实参富士山把它的地址给了形参东风导弹,接着形参东风导弹根据实参富士山提供的地址占到富士山,解引用就相当于按下爆炸按钮并发生爆炸(这里的爆炸相当于程序中修改数值),爆炸结束后形参东风导弹没了(形参消失),实参富士山还在那里(实参地址没有改变)但是却火山喷发没了樱花(实参的内容发生了改变)。