C语言形式参数和实际参数的区别(附带示例)

C语言形式参数和实际参数的区别(附带示例)

在C语言中,形式参数和实际参数是函数调用过程中的两个重要概念,它们之间的区别和联系对于理解函数的工作原理至关重要。

形式参数(也称为形参)是在函数定义时声明的参数,它们在函数头部列出,用于指定函数期望接收的输入。形参本质上是函数内部的局部变量,用于存储调用函数时传递给它的值,因此,形参在函数体内可以像普通变量一样使用。

实际参数(也称为实参)是在调用函数时传递给函数的具体值或表达式,这些值会被复制到对应的形式参数中。实参可以是常量、变量、表达式或者函数调用的结果。

让我们通过一个简单的例子来说明形参和实参的概念:

c 复制代码
#include <stdio.h>

// 函数声明,x 和 y 是形式参数
int add(int x, int y) {
    return x + y;
}

int main() {
    int a = 5, b = 3;
    int result;

    // 函数调用,a 和 b 是实际参数
    result = add(a, b);

    printf("结果:%d\n", result);

    return 0;
}

在这个例子中,add 函数定义了两个形式参数 x 和 y。当我们在 main 函数中调用 add(a, b) 时,变量 a 和 b 就是实际参数。

形式参数和实际参数之间存在几个重要的区别:

  • 作用域不同:形式参数的作用域限于函数内部,而实际参数的作用域取决于它们在程序中的声明位置。在上面的例子中,x 和 y 只在 add 函数内有效,而 a 和 b 在 main 函数中有效。
  • 存储位置不同:形式参数在函数调用时在栈上创建,函数返回时销毁。实际参数可能存储在程序的任何内存区域,取决于它们的声明方式(如全局变量、局部变量或动态分配的内存)。
  • 数据传递方式:在C语言中,实际参数到形式参数的数据传递默认采用"值传递"方式,这意味着实际参数的值会被复制到形式参数中,函数内对形式参数的修改不会影响实际参数的值。

让我们通过另一个例子来说明值传递的特性:

c 复制代码
#include <stdio.h>

void swap(int x, int y) {
    int temp = x;
    x = y;
    y = temp;
    printf("在 swap 函数内:x = %d, y = %d\n", x, y);
}

int main() {
    int a = 10, b = 20;
    printf("交换前:a = %d, b = %d\n", a, b);
    swap(a, b);
    printf("交换后:a = %d, b = %d\n", a, b);
    return 0;
}

运行这段代码,我们会得到以下输出:

复制代码
交换前:a = 10, b = 20
在 swap 函数内:x = 20, y = 10
交换后:a = 10, b = 20

从输出结果我们可以看到,尽管在 swap 函数内部 x 和 y 的值发生了交换,但 main 函数中的 a 和 b 的值并没有改变。这是因为 swap 函数接收的是 a 和 b 的副本,而不是它们的引用。

如果我们想在函数内部修改实际参数的值,可以使用指针作为参数,这种方式被称为"引用传递"(虽然C语言中没有真正的引用类型,但使用指针可以达到类似的效果)。例如:

c 复制代码
#include <stdio.h>

void swap(int *x, int *y) {
    int temp = *x;
    *x = *y;
    *y = temp;
}

int main() {
    int a = 10, b = 20;
    printf("交换前:a = %d, b = %d\n", a, b);
    swap(&a, &b);
    printf("交换后:a = %d, b = %d\n", a, b);
    return 0;
}

这段代码的输出将会是:

复制代码
交换前:a = 10, b = 20
交换后:a = 20, b = 10

在这个修改后的版本中,swap 函数的形式参数是指向整数的指针。通过传递 a 和 b 的地址作为实际参数,函数能够直接修改这些变量的值。

相关推荐
m0_547486666 小时前
《数据结构 (C语言)》期末试卷及答案(10套)2026版
c语言·开发语言·数据结构
八月的雨季 最後的冰吻6 小时前
FFmepg-- 42-ffplay.c 线程安全机制深度分析
c语言·安全·ffmpeg
逐光者9337 小时前
滤波器的 R 与 C 如何选择:从截止频率到工程实践
c语言·开发语言·r语言
水饺编程7 小时前
第2章:Linux 基础,whoami 命令
linux·c语言·汇编
Logic1019 小时前
C语言/数据结构动态规划题解:字符串变回文的最少操作次数——最长回文子序列(LPS)
c语言·数据结构·算法·动态规划·时间复杂度·回文串·最长回文子序列
wuminyu9 小时前
ZGC染色指针在虚拟线程stackChunkOop上的并发屏障全景分析
java·linux·c语言·jvm·c++
Logic10110 小时前
C语言/数据结构组合数学题解:数字好排列计数——质数倍数分类与阶乘取模
c语言·数据结构·算法·组合数学·时间复杂度·排列·取模运算
沫璃染墨11 小时前
《从零入门数据结构与算法(二):线性表详解——从顺序表原理到静态与动态实现》
c语言·数据结构·顺序表
wuyk55511 小时前
样章-第03讲-FreeRTOS在16KB-RAM上的裁剪与陷阱
c语言·开发语言·stm32·单片机·嵌入式硬件·物联网·系统架构
爱读书的小胖11 小时前
Codewars Sum of a Sequence Hard Core Version C 解题分析
c语言·数据结构·算法