函数调用
2026/9/14大约 2 分钟
函数调用
1. 考点:传值调用
- ①传值调用:形参取的是实参的值,形参的改变不会影响实参的值【单向】
main()
{
int a=3,b=4;
S(a,b);
printf("%d %d",a,b);
}
void S(int x,int y)
{
int t;
t=x; x=y; y=t;
}2. 考点:传址调用
- ②传址调用(引用调用、指针调用):形参取的是实参的地址,形参的改变会影响实参的值【双向】
main()
{
int a=3,b=4;
S(a,b);
printf("%d %d",a,b);
}
void S(int *x,int *y)
{
int t;
t=*x; *x=*y; *y=t;
}3. 总结
| 传递方式 | 主要特点 |
|---|---|
| 传值调用 | 形参取的是实参的值,形参的改变不会影响实参的值【单向】 |
| 传址调用 引用调用 指针调用 | 形参取的是实参的地址,形参的改变会影响实参的值【双向】 |
注:在传值调用中,实参可以是变量,也可以是常量和表达式,而在传址调用中,实参不能是常量,且实参必须表示地址。
4. 经典例题
4.1 题目一
题目: 函数f()、h()定义如下,调用函数h()时,第一个参数采用传值(call by value)方式,第二个参数采用传引用(call by reference)方式。设有函数调用函数f(5),那么“print(x)”执行后输出的值为()。
- A、24
- B、25
- C、30
- D、36
f (int args) { int x=6; h(args,x); print (x) ; } h(int x , int &a) { x=x-1; a=a*x; return; }
解析与计算步骤:
初始化:
- 执行函数调用
f(5),此时参数args = 5。 - 在函数
f内部,定义局部变量x = 6。
- 执行函数调用
调用
h(args, x):- 第一个参数
args(值为5)采用传值调用:传递的是数据副本。在h中修改x不会影响外部的args。 - 第二个参数
x(值为6)采用传引用调用:形参a引用了f中的局部变量x的地址(即a绑定了f的x)。
- 第一个参数
在函数
h内部执行:x = x - 1:h自身的形参x变为5 - 1 = 4。a = a * x:因为a引用的是f的局部变量x(其原值为 6),所以执行f的x = 6 * 4 = 24。此时f中的局部变量x的值被修改为了24。
输出结果:
- 返回函数
f后,执行print(x),此时f中的局部变量x的值为24。
- 返回函数
正确答案:A、24。
