- C编程教程
- C语言 - 首页
- C语言基础
- C语言 - 概述
- C语言 - 特性
- C语言 - 历史
- C语言 - 环境搭建
- C语言 - 程序结构
- C语言 - Hello World
- C语言 - 编译过程
- C语言 - 注释
- C语言 - 词法单元
- C语言 - 关键字
- C语言 - 标识符
- C语言 - 用户输入
- C语言 - 基本语法
- C语言 - 数据类型
- C语言 - 变量
- C语言 - 整数提升
- C语言 - 类型转换
- C语言 - 类型强制转换
- C语言 - 布尔值
- C语言中的常量和字面量
- C语言 - 常量
- C语言 - 字面量
- C语言 - 转义序列
- C语言 - 格式说明符
- C语言中的运算符
- C语言 - 运算符
- C语言 - 算术运算符
- C语言 - 关系运算符
- C语言 - 逻辑运算符
- C语言 - 位运算符
- C语言 - 赋值运算符
- C语言 - 一元运算符
- C语言 - 自增和自减运算符
- C语言 - 三元运算符
- C语言 - sizeof 运算符
- C语言 - 运算符优先级
- C语言 - 其他运算符
- C语言中的决策
- C语言 - 决策
- C语言 - if 语句
- C语言 - if...else 语句
- C语言 - 嵌套 if 语句
- C语言 - switch 语句
- C语言 - 嵌套 switch 语句
- C语言中的循环
- C语言 - 循环
- C语言 - while 循环
- C语言 - for 循环
- C语言 - do...while 循环
- C语言 - 嵌套循环
- C语言 - 死循环
- C语言 - break 语句
- C语言 - continue 语句
- C语言 - goto 语句
- C语言中的函数
- C语言 - 函数
- C语言 - 主函数
- C语言 - 值传递函数调用
- C语言 - 引用传递函数调用
- C语言 - 嵌套函数
- C语言 - 变参函数
- C语言 - 用户自定义函数
- C语言 - 回调函数
- C语言 - return 语句
- C语言 - 递归
- C语言中的作用域规则
- C语言 - 作用域规则
- C语言 - 静态变量
- C语言 - 全局变量
- C语言中的数组
- C语言 - 数组
- C语言 - 数组的特性
- C语言 - 多维数组
- C语言 - 将数组传递给函数
- C语言 - 从函数返回数组
- C语言 - 变长数组
- C语言中的指针
- C语言 - 指针
- C语言 - 指针和数组
- C语言 - 指针的应用
- C语言 - 指针运算
- C语言 - 指针数组
- C语言 - 指向指针的指针
- C语言 - 将指针传递给函数
- C语言 - 从函数返回指针
- C语言 - 函数指针
- C语言 - 指向数组的指针
- C语言 - 指向结构体的指针
- C语言 - 指针链
- C语言 - 指针与数组的区别
- C语言 - 字符指针和函数
- C语言 - 空指针
- C语言 - void 指针
- C语言 - 野指针
- C语言 - 解引用指针
- C语言 - 近指针、远指针和巨指针
- C语言 - 指针数组的初始化
- C语言 - 指针与多维数组的区别
- C语言中的字符串
- C语言 - 字符串
- C语言 - 字符串数组
- C语言 - 特殊字符
- C语言结构体和联合体
- C语言 - 结构体
- C语言 - 结构体和函数
- C语言 - 结构体数组
- C语言 - 自引用结构体
- C语言 - 查找表
- C语言 - 点(.)运算符
- C语言 - 枚举(enum)
- C语言 - 结构体填充和压缩
- C语言 - 嵌套结构体
- C语言 - 匿名结构体和联合体
- C语言 - 联合体
- C语言 - 位域
- C语言 - typedef
- C语言中的文件处理
- C语言 - 输入输出
- C语言 - 文件I/O (文件处理)
- C语言预处理器
- C语言 - 预处理器
- C语言 - 编译指示
- C语言 - 预处理器运算符
- C语言 - 宏
- C语言 - 头文件
- C语言中的内存管理
- C语言 - 内存管理
- C语言 - 内存地址
- C语言 - 存储类别
- 其他主题
- C语言 - 错误处理
- C语言 - 可变参数
- C语言 - 命令执行
- C语言 - 数学函数
- C语言 - static 关键字
- C语言 - 随机数生成
- C语言 - 命令行参数
- C语言编程资源
- C语言 - 问答
- C语言 - 快速指南
- C语言 - 速查表
- C语言 - 有用资源
- C语言 - 讨论
C语言值传递函数调用
在C语言中,一个函数可以从任何其他函数(包括自身)调用。函数调用有两种方式:(a)值传递和(b)引用传递。默认情况下,使用值传递机制。
形式参数和实际参数
您必须了解这些术语才能理解值传递方法的工作原理:
形式参数 - 函数需要某些数据来执行其所需的过程。定义函数时,假设数据值将以参数或参数列表的形式提供,该列表位于函数名前面的括号内。这些参数是某种数据类型的变量。
实际参数 - 当要调用某个函数时,应为其提供相同类型且顺序相同的所需数量的值,就像在其定义中使用的那样。
看看下面的代码片段:
type function_name(type var1, type var2, ...)
这里,参数变量称为形式参数。在函数的作用域内,这些变量充当其局部变量。
考虑以下函数:
int add(int x, int y){ int z = x + y; return z; }
此函数定义中的参数x和y是形式参数。
示例:C语言中的值传递
如果调用add()函数,如下面的代码所示,则括号内的变量(a和b)是实际参数。它们被传递给函数。
请看下面的例子:
#include <stdio.h> int add(int x, int y){ int z = x + y; return z; } int main(){ int a = 10, b = 20; int c = add(a, b); printf("Addition: %d", c); }
输出
运行此代码后,将产生以下输出:
Addition: 30
值传递方法意味着实际参数的值被复制到形式参数变量中。因此,“x”取“a”的值,“b”赋值给“y”。add()函数中的局部变量“z”存储加法值。在main()函数中,add()函数返回的值被赋值给“c”,然后打印出来。
请注意,C语言中的变量是内存中的命名位置。因此,变量在内存中创建,并且每个变量由编译器分配一个随机内存地址。
C语言中的“值传递”是如何工作的?
让我们假设main()函数中的变量a、b和c分别占据内存位置100、200和300。当用a和b作为实际参数调用add()函数时,它们的值分别存储在x和y中。
变量x、y和z是add()函数的局部变量。在内存中,它们将被分配一些随机位置。让我们假设它们分别在内存地址1000、2000和3000中创建。
由于函数是通过将实际参数的值复制到其对应的形式参数变量来调用的,因此x和y的地址(分别是1000和2000)将分别保存10和20。编译器将其和分配给第三个局部变量z,然后返回。
当控制返回到main()函数时,返回的数据被赋值给c,并显示为程序的输出。
示例
值传递是C语言中默认的函数调用机制。它消除了函数的潜在副作用,使您的软件更易于维护和理解。它最适合于预期对接收到的参数进行特定计算并返回结果的函数。
这是另一个值传递的例子:
#include <stdio.h> /* function declaration */ void swap(int x, int y); int main(){ /* local variable definition */ int a = 100; int b = 200; printf("Before swap, value of a: %d\n", a); printf("Before swap, value of b: %d\n", b); /* calling a function to swap the values */ swap(a, b); printf("After swap, value of a: %d\n", a); printf("After swap, value of b: %d\n", b); return 0; } void swap(int x, int y){ int temp; temp = x; /* save the value of x */ x = y; /* put y into x */ y = temp; /* put temp into y */ return; }
输出
运行此代码后,将产生以下输出:
Before swap, value of a: 100 Before swap, value of b: 200 After swap, value of a: 100 After swap, value of b: 200
它表明值没有改变,尽管它们在函数内部发生了改变。
由于值被复制到另一个函数的不同局部变量中,任何操作都不会影响调用函数中的实际参数变量。
但是,当我们需要将大型对象(如数组或文件)传递给另一个函数时,值传递方法效率较低。此外,在某些情况下,我们可能需要另一个函数来操作实际参数。在这种情况下,值传递机制不起作用。我们必须为此目的探索引用传递机制。请参考下一章,了解C语言引用传递机制的详细解释。
引用传递方法涉及传递保存实际参数值的变量的地址。您可以设计一种调用方法,该方法是值传递和引用传递的混合。在这种情况下,某些参数按值传递,而其他参数按引用传递。