“传值和传址调用”的版本间的差异
跳到导航
跳到搜索
Jihongchang(讨论 | 贡献) (建立内容为“https://www.bilibili.com/video/BV1hg411V7Bm?p=47”的新页面) |
Jihongchang(讨论 | 贡献) |
||
(未显示同一用户的8个中间版本) | |||
第1行: | 第1行: | ||
https://www.bilibili.com/video/BV1hg411V7Bm?p=47 | https://www.bilibili.com/video/BV1hg411V7Bm?p=47 | ||
+ | |||
+ | === 1)数据类型 === | ||
+ | 数据类型 | ||
+ | |||
+ | * 数据值是否改变 | ||
+ | ** 常量:只有右值,值不能改变 | ||
+ | *** 字符 'a' | ||
+ | *** 字符串 "a" | ||
+ | *** 整型 1、2 | ||
+ | ** 变量:有左值和右值,值可改变 | ||
+ | * 作用域 | ||
+ | ** 全局变量:存储空间一般不变 | ||
+ | ** 局部变量:存储空间动态变化 | ||
+ | * 数据类型 | ||
+ | ** 基本类型(int/char/float double/bool) | ||
+ | ** 特殊类型(void) | ||
+ | ** 用户定义类型(enum) | ||
+ | ** 构造类型(数组、结构、联合) | ||
+ | ** 指针类型(type*) | ||
+ | ** 抽象数据类型(类类型) | ||
+ | |||
+ | |||
+ | === 2)传值和传址调用 === | ||
+ | [[文件:传值和传址调用.png|无|缩略图|600x600像素]] | ||
+ | {| class="wikitable" | ||
+ | !传递方式 | ||
+ | !主要特点 | ||
+ | |- | ||
+ | |传值调用 | ||
+ | |形参取的是实参的值,形参的改变不会导致调用点所传的实参的值发生改变 | ||
+ | |- | ||
+ | |引用(地址)调用 | ||
+ | |形参取的是实参的地址,即相当于实参存储单元的地址引用,因此其值的改变同时就改变了实参的值。 | ||
+ | |||
+ | |||
+ | 参数的左值为地址,右值为具体的值。 | ||
+ | |} | ||
+ | |||
+ | |||
+ | === 2)传值和传址调用 === | ||
+ | |||
+ | ==== 传值调用 ==== | ||
+ | <syntaxhighlight lang="c"> | ||
+ | void swap(int x, int y) | ||
+ | { | ||
+ | int t; | ||
+ | t = x; | ||
+ | x = y; | ||
+ | y = t; | ||
+ | printf("%d %d", x, y); | ||
+ | } | ||
+ | |||
+ | main() | ||
+ | { | ||
+ | int a = 3, b = 4; | ||
+ | swap(a, b); | ||
+ | printf("%d %d", a, b); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | [[文件:传值调用.png|无|缩略图]] | ||
+ | |||
+ | |||
+ | ==== 传址调用 ==== | ||
+ | <syntaxhighlight lang="c"> | ||
+ | void swap(int *x, int *y) | ||
+ | { | ||
+ | int a, *t=&a; | ||
+ | *t = *x; | ||
+ | *x = *y; | ||
+ | *y = *t; | ||
+ | printf("%d %d", *x, *y); | ||
+ | } | ||
+ | |||
+ | main() | ||
+ | { | ||
+ | int a = 3, b = 4; | ||
+ | swap(&a, &b); | ||
+ | printf("%d %d", a, b); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | [[文件:传址调用.png|无|缩略图]] | ||
+ | |||
+ | |||
+ | === 考点1:参数传递差异 === | ||
+ | 程序语言提供的传值调用机制是将()。 | ||
+ | |||
+ | A、实参的值传递给被调用函数的形参 √ | ||
+ | |||
+ | B、实参的地址传递给被调用函数的形参 | ||
+ | |||
+ | C、形参的值传递给被调用函数的实参 | ||
+ | |||
+ | D、形参的地址传递给被调用函数的实参 | ||
+ | |||
+ | |||
+ | === 考点2:传值和传址调用 === | ||
+ | 函数fun1()、fun2()的定义如下:<syntaxhighlight lang="c"> | ||
+ | fun1(int x) | ||
+ | { | ||
+ | int a = x - 1; | ||
+ | x = fun2(a); | ||
+ | return a - x; | ||
+ | } | ||
+ | |||
+ | fun2(int x) | ||
+ | { | ||
+ | x = x + 10; | ||
+ | return 3 * x; | ||
+ | } | ||
+ | |||
+ | </syntaxhighlight>所示,已知调用fun1时传递给形参x的值是-5,若以引用调用(call by reference)的方式调用fun2,则函数fun1的返回值为();<syntaxhighlight lang="c"> | ||
+ | fun1(int x) | ||
+ | { | ||
+ | int a = x - 1; | ||
+ | x = fun2(&a); | ||
+ | return a - x; | ||
+ | } | ||
+ | |||
+ | fun2(int *x) | ||
+ | { | ||
+ | *x = *x + 10; | ||
+ | return 3**x; | ||
+ | } | ||
+ | </syntaxhighlight>A、-18 | ||
+ | |||
+ | B、-11 | ||
+ | |||
+ | C、-8 √ | ||
+ | |||
+ | D、0 | ||
+ | |||
+ | 若以值调用(call by value)的方式调用fun2,则函数fun1的返回值为()。 | ||
+ | |||
+ | A、-18 √ | ||
+ | |||
+ | B、-11 | ||
+ | |||
+ | C、-8 | ||
+ | |||
+ | D、0 |
2022年9月15日 (四) 04:17的最新版本
https://www.bilibili.com/video/BV1hg411V7Bm?p=47
1)数据类型
数据类型
- 数据值是否改变
- 常量:只有右值,值不能改变
- 字符 'a'
- 字符串 "a"
- 整型 1、2
- 变量:有左值和右值,值可改变
- 常量:只有右值,值不能改变
- 作用域
- 全局变量:存储空间一般不变
- 局部变量:存储空间动态变化
- 数据类型
- 基本类型(int/char/float double/bool)
- 特殊类型(void)
- 用户定义类型(enum)
- 构造类型(数组、结构、联合)
- 指针类型(type*)
- 抽象数据类型(类类型)
2)传值和传址调用
传递方式 | 主要特点 |
---|---|
传值调用 | 形参取的是实参的值,形参的改变不会导致调用点所传的实参的值发生改变 |
引用(地址)调用 | 形参取的是实参的地址,即相当于实参存储单元的地址引用,因此其值的改变同时就改变了实参的值。
|
2)传值和传址调用
传值调用
void swap(int x, int y)
{
int t;
t = x;
x = y;
y = t;
printf("%d %d", x, y);
}
main()
{
int a = 3, b = 4;
swap(a, b);
printf("%d %d", a, b);
}
传址调用
void swap(int *x, int *y)
{
int a, *t=&a;
*t = *x;
*x = *y;
*y = *t;
printf("%d %d", *x, *y);
}
main()
{
int a = 3, b = 4;
swap(&a, &b);
printf("%d %d", a, b);
}
考点1:参数传递差异
程序语言提供的传值调用机制是将()。
A、实参的值传递给被调用函数的形参 √
B、实参的地址传递给被调用函数的形参
C、形参的值传递给被调用函数的实参
D、形参的地址传递给被调用函数的实参
考点2:传值和传址调用
函数fun1()、fun2()的定义如下:
fun1(int x)
{
int a = x - 1;
x = fun2(a);
return a - x;
}
fun2(int x)
{
x = x + 10;
return 3 * x;
}
所示,已知调用fun1时传递给形参x的值是-5,若以引用调用(call by reference)的方式调用fun2,则函数fun1的返回值为();
fun1(int x)
{
int a = x - 1;
x = fun2(&a);
return a - x;
}
fun2(int *x)
{
*x = *x + 10;
return 3**x;
}
A、-18
B、-11
C、-8 √
D、0
若以值调用(call by value)的方式调用fun2,则函数fun1的返回值为()。
A、-18 √
B、-11
C、-8
D、0