浅谈c语言的形参和实参

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的值改变了,这是为什呢?

对于我们的普通形参变量,在函数调用时我们只是简单的将实参的值复制了一份给形参,形参拿到的只是实参的值,形参并不知道实参来自哪里,它只是老老实实的接受一个值而已,等到函数调用完成,形参就没了,实参丝毫不受影响。

可是对于指针形参变量来说,实参给形参的是实参的地址,形参可以根据地址“上门服务”,一旦函数调用,形参就根据地址找到实参的“老家”,然后通过解引用开始改变数值。函数调用结束形参指针就没了,但是实参的修改是是不可逆的。

举一个是个中国人都觉得恰当的例子

形参指针是东风导弹,实参指针是日本富士山。进行函数调用时,实参富士山把它的地址给了形参东风导弹,接着形参东风导弹根据实参富士山提供的地址占到富士山,解引用就相当于按下爆炸按钮并发生爆炸(这里的爆炸相当于程序中修改数值),爆炸结束后形参东风导弹没了(形参消失),实参富士山还在那里(实参地址没有改变)但是却火山喷发没了樱花(实参的内容发生了改变)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值