C++形参与实参的区别实例解析

作者:shichen2014 时间:2023-11-02 23:39:05 

本文以实例阐述了C++中形参与实参的区别,有助于读者加深对于C++形参与实参的认识。

形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。 形参和实参的功能是作数据传送。发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。

1.形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。

2.实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。

3.实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误。

4.函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。

参考如下示例:


void Exchg1(int x, int y)
{
int tmp;
tmp=x;
x=y;
y=tmp;
printf("Exchg1:x=%d,y=%d\n",x,y);
}
void Exchg2(int &x, int &y)
{
int tmp;
tmp=x;
x=y;
y=tmp;
printf("Exchg2:x=%d,y=%d\n",x,y);
}
void Exchg3(int *x, int *y)
{
int tmp;
tmp=*x;
*x=*y;
*y=tmp;
printf("Exchg3:x=%d,y=%d\n",*x,*y);
}

void main()
{
int a=4,b=6;
Exchg1 (a,b) ;
printf("a=%d,b=%d\n",a,b);
Exchg2 (a,b);
printf("a=%d,b=%d\n",a,b);
Exchg3(&a,&b) ;
printf("a=%d,b=%d\n",a,b);
}

这里Exchg1函数被调用的时候,并没有成功交换a跟b的数据。为何呢。
int a=4,b=6;
Exchg1 (a,b) ;   //这里本质上发生的是:Exchg1 (intx=a,int y=b) ;   x跟y是函数定义里面的形参,也就是说这里只是把实参a跟b的值赋予了x,y这2个形参变量。接下来,函数里发生的值互换只换掉了x跟y的值,而实参a跟b没有影响。
再看Exchg2 (a,b);   //再看本质Exchg2 (int &x=a,int &y=b);   这里x跟y都是a,b的引用,操作x跟y交换就等于a跟b交换,自然,调用Exchg2 可以成功交换a跟b
Exchg3(&a,&b) ;   //Exchg3(int *x=&a,int *y=&b);   x跟y2个形参是a跟b的指针,也就是实参数据存放的地址。然后函数里交换了x跟y指向的数据,也就是实参a跟b,所以,交换也是成功的。

代码运行的结果,exchg1没有交换a,b值;exchg2交换了a,b值,到了exchg,a,b的值似乎没有交换,仍旧是a为4,b为6,刚开始以为代码有问题,后来设置了断点之后,发现代码运行到exchg3(&a,&b)时,a=6,b=4了,所以代码运行结果和初始值一样的话,说明已经交换了a,b的值,至此说明代码是没有任何问题的。

标签:C++,形参,实参
0
投稿

猜你喜欢

  • C#实现封面图片生成器的示例代码

    2023-05-15 11:05:58
  • spring boot actuator监控超详细教程

    2021-06-27 01:29:36
  • java实现Socket通信之单线程服务

    2022-08-24 14:41:06
  • Java 常量池详解之字符串常量池实现代码

    2022-09-09 22:12:03
  • java 中二分法查找的应用实例

    2021-10-18 08:43:33
  • Android开发笔记之Android中数据的存储方式(二)

    2022-12-04 01:05:55
  • Android应用内悬浮窗的实现方案示例

    2022-05-07 20:29:24
  • IntelliJ IDEA(2019)安装破解及HelloWorld案例(图文)

    2022-07-01 22:43:39
  • Java实战之制作在线音乐网站

    2021-11-11 01:36:02
  • C++实现LeetCode(9.验证回文数字)

    2023-06-21 00:20:38
  • Java网络编程UDP实现多线程在线聊天

    2022-01-08 21:48:32
  • Android源码 在Ubuntu上下载,编译和安装

    2022-11-28 14:31:29
  • Java系统变量参数获取设置System.getProperties()的方法

    2021-07-22 04:52:47
  • Android 仿淘宝、京东商品详情页向上拖动查看图文详情控件DEMO详解

    2022-01-17 12:21:18
  • Jmeter配置代理实现录制过程图解

    2022-01-15 20:25:32
  • Struts2中接收表单数据的三种驱动方式

    2022-04-21 09:23:11
  • 200行java代码实现2048小游戏

    2023-11-29 12:03:57
  • 关于@MapperScan包扫描的坑及解决

    2023-02-13 02:45:46
  • Android中获取资源 id 及资源 id 的动态获取

    2023-06-30 04:38:06
  • Android仿优酷视频的悬浮窗播放效果

    2022-04-30 20:44:51
  • asp之家 软件编程 m.aspxhome.com