当前位置: 首页 > news >正文

形参和实参

目录

形参(形式参数): 

实参(实际参数):

形参和实参的区别和联系

具体实例:     


当我们谈论"形参"和"实参"时,可以用以下类比来解释它们之间的关系:

形参就像是一个空杯子,而实参就是要倒进这个杯子里的水。

形参(形式参数): 

-在函数定义中出现的参数可以看做是一个站位符,它没有数据,只能等到函数被调用时接受传递来的数据,所以简称形式参数,简称形参

-形参就像是函数或方法定义中声明的空杯子,它们用来接收传递给函数或方法的值。

-形参只有在函数或方法被定义时才存在,并且没有具体的值,就像空杯子一样等待被填充。

实参(实际参数):

-函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以简称实际参数,简称实参

-实参就像是要被倒入空杯子的水,它们是实际传递给函数或方法的具体值。

-实参是调用函数或方法时提供的实际数据,它们会被传递给形参并填充到空杯子里。

-形参和实参的功能是传递数据,发生函数调用的时,实参的值会传递给形参

换句话说,形参是函数或方法定义中的占位符,而实参是在调用函数或方法时提供给形参的具体值。

举个简单的例子,假设我们有一个函数用来打印一个人的名字:

void PrintName(string name) // 这里的name就是形参,就像一个空杯子
{Console.WriteLine($"Hello, {name}!");
}PrintName("Alice"); // 在调用函数时,传递的"Alice"就是实参,就像要被倒入空杯子的水

在这个例子中,函数 PrintName 中的 name 就是形参,它等待被实参填充。而在调用函数时,我们提供了实参 "Alice",它被传递给形参 name 并填充到函数中。

形参和实参的区别和联系


1) 形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。


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

3) 实参和形参在数量上、类型上、顺序上必须严格一致,否则会发生“类型不匹配”的错误。当然,如果能够进行自动类型转换,或者进行了强制类型转换,那么实参类型也可以不同于形参类型。

4) 函数调用中发生的数据传递是单向的,只能把实参的值传递给形参,而不能把形参的值反向地传递给实参;换句话说,一旦完成数据的传递,实参和形参就再也没有瓜葛了,所以,在函数调用过程中,形参的值发生改变并不会影响实参。

因此,形参和实参之间的实际区别在于,形参是函数或方法定义中的占位符,而实参是在调用函数或方法时提供给形参的具体值。

具体实例:     

#include <stdio.h>//计算从m加到n的值
int sum(int m, int n) {int i;for (i = m+1; i <= n; ++i) {m += i;}return m;
}int main() {int a, b, total;printf("Input two numbers: ");scanf("%d %d", &a, &b);total = sum(a, b);printf("a=%d, b=%d\n", a, b);printf("total=%d\n", total);return 0;
}

运行结果:
Input two numbers: 1 100↙
a=1, b=100
total=5050

在这段代码中,函数定义处的 m、n 是形参,函数调用处的 a、b 是实参。通过 scanf() 可以读取用户输入的数据,并赋值给 a、b,在调用 sum() 函数时,这份数据会传递给形参 m、n。

从运行情况看,输入 a 值为 1,即实参 a 的值为 1,把这个值传递给函数 sum() 后,形参 m 的初始值也为 1,在函数执行过程中,形参 m 的值变为 5050。函数运行结束后,输出实参 a 的值仍为 1,可见实参的值不会随形参的变化而变化。

以上调用 sum() 时是将变量作为函数实参,除此以外,你也可以将常量、表达式、函数返回值作为实参,如下所示

total = sum(10, 98);  //将常量作为实参
total = sum(a+10, b-3);  //将表达式作为实参
total = sum( pow(2,2), abs(-100) );  //将函数返回值作为实参

5) 形参和实参虽然可以同名,但它们之间是相互独立的,互不影响,因为实参在函数外部有效,而形参在函数内部有效。

更改上面的代码,让实参和形参同名:

#include <stdio.h>//计算从m加到n的值
int sum(int m, int n) {int i;for (i = m + 1; i <= n; ++i) {m += i;}return m;
}int main() {int m, n, total;printf("Input two numbers: ");scanf("%d %d", &m, &n);total = sum(m, n);printf("m=%d, n=%d\n", m, n);printf("total=%d\n", total);return 0;
}

运行结果:
Input two numbers: 1 100
m=1, n=100
total=5050

调用 sum() 函数后,函数内部的形参 m 的值已经发生了变化,而函数外部的实参 m 的值依然保持不变,可见它们是相互独立的两个变量,除了传递参数的一瞬间,其它时候是没有瓜葛的。 

http://www.lryc.cn/news/288258.html

相关文章:

  • [git] windows系统安装git教程和配置
  • php的性能要比node.js高很多吗?
  • [极客大挑战 2019]BabySQL1
  • 机器视觉在OCR字符检测的应用
  • 讲清楚浅拷贝和深拷贝
  • [足式机器人]Part2 Dr. CAN学习笔记- 最优控制Optimal Control Ch07
  • RedisInsight详细安装教程
  • maven组件升级报错经验汇总
  • JS 中的 async 与 await
  • SQL 系列教程(六)
  • CocoaPods的安装和使用
  • Linux下软件安装的命令【RPM,YUM】及常用服务安装【JDK,Tomcat,MySQL】
  • 【linux】-telnet服务安装
  • 安卓开发——Activity及常用布局和控件的使用
  • .net访问oracle数据库性能问题
  • vue上传解析excel表格并修改字段名
  • jupyter notebook删除kernel & conda 删除虚拟环境
  • Redis在生产环境中可能遇到的问题与解决方案(三)
  • 【C++干货铺】 RAII实现智能指针
  • 【竞技宝jjb.lol】LOL:xiaohu岩雀天命抢龙扭转乾坤 WBG2-0轻取RA
  • GoZero微服务个人探究之路(九)api文件编写总结
  • 泛型..
  • Android App开发基础(1)—— App的开发特点
  • docker-compose初探
  • 【webrtc】跟webrtc学时间戳、序号类型转换
  • 文件操作与IO(一些小项目)
  • C语言-算法-线性dp
  • Pandas应用-股票分析实战
  • Database history tablesupgraded
  • Dify学习笔记-应用发布(四)