函数形参、实参的变化

在函数的定义和使用中,存在形参和实参这样的概念。假设有如下的函数定义:

void func(int a);

       此时,定义了一个函数,函数名是func;函数的参数是 int a,那么,这就叫做形参;假设函数有如下的调用:

int b = 100;

func(b);

       那么,调用func函数的时候,把变量b传递给func函数的形参变量a,相当于:

int a = b;

       那么,变量b就叫做“实参”,func函数中声明定义的变量a就叫做“形参”。那么,我们来看看一个形参和实参使用的例子:

       程序运行结果如下:

       可以看到,变量b作为实参,传递给func函数的形参变量a。然后,在func函数中,修改形参变量a 的值,但是,在func函数的外面,并没有对实参变量b有任何改变。因为调用函数func(b)的时候,如同:

int a = b;

       此时,定义了形参变量a,存放实参变量b的值。那么,在func函数中修改形参变量a的值时,只是对形参变量a存储的数据进行修改,对实参变量b没有任何影响。其实,形参变量a和实参变量b就是两个完全独立的变量。形参变量a的改变,不会引起实参变量b的变化。

       那么,我们想让形参变量a改变的时候,引起实参变量b的修改,应该怎么样设计?此时,可以考虑使用指针变量。修改上面的例子,定义函数形参是一个指针,如下:

void func(int* pa);

       此时,定义func函数,函数的参数是一个指针;那么,调用该函数如下:

int b;

func(&b);

       此时,取变量b的地址作为实参,传递给参数 int* pa指针,等同如下表达式:

int* pa = &b;

       那么,pa指针就指向了变量b。程序测试例子如下:

       程序运行结果如下:

       可以看到,变量b初始化的值为69,经过func函数调用之后,在func函数中修改了变量b的值;那么,在func函数中对形参变量的修改,导致实参变量的改变。所以,实参变量b的值变成了168数值。

       此时,我们知道了怎么样应用指针作为函数的参数,修改函数形参变量的值,可以引起实参变量值的改变。那么,我们来定义一个函数,它可以接收两个参数,在函数中交互两个参数的值。例如有 a = 1, b = 2; 交互之后,变为 a = 2, b = 1。程序测试例子如下:

       程序的运行结果如下:

       从运行结果可以看出,在func函数中,交换了变量a、b的值。但是,在func函数中交换的变量a、b是形参变量,与func函数外面的实参变量a、b不是同一个变量。调用函数,以“传值”的形式调用函数,形参的改变,不会引起实参的变化。那么,为了在func函数中修改形参变量时,能够引起实参变量的改变。形参变量应该使用指针。修改后的程序测试例子如下:

       程序的运行结果如下:

       可以看到,func函数接收变量a、b的地址作为实参,那么,相应:

int* pa = &a;

int* pb = &b;

       所以,形参变量pa指向实参变量a,形参变量pb指向实参变量b。例如,执行:

*pa = 168;

       此时,使用指针降级运算符*对指针变量进行“降级”,转换为指针变量pa所指向的变量。那么,由于指针变量pa指向变量a,所以,*pa就表示变量a。此时,就是给变量a进行赋值。

韦凯峰 Linux C/C++ 程序设计教程,Linux 系统编程,Openwrt 系统开发,微信:13926572996,QQ:1523520001,博客:www.mylinux.vip

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韦凯峰Linux编程学堂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值