函数调用
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。
