“传值和传址调用”的版本间的差异

来自姬鸿昌的知识库
跳到导航 跳到搜索
 
(未显示同一用户的2个中间版本)
第93行: 第93行:
  
 
D、形参的地址传递给被调用函数的实参
 
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)传值和传址调用

传值和传址调用.png
传递方式 主要特点
传值调用 形参取的是实参的值,形参的改变不会导致调用点所传的实参的值发生改变
引用(地址)调用 形参取的是实参的地址,即相当于实参存储单元的地址引用,因此其值的改变同时就改变了实参的值。


参数的左值为地址,右值为具体的值。


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);
}
传值调用.png


传址调用

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);
}
传址调用.png


考点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