首页 > 编程笔记 > C语言笔记

C语言形参和实参用法详解(附带示例)

在C语言中,函数参数的使用是一个非常重要的概念。函数参数分为形式参数(简称形参)和实际参数(简称实参),理解这两种参数的区别和用法对于编写正确的C语言代码至关重要。
 

形参是在函数定义时声明的参数,它们在函数内部充当占位符,用于接收调用函数时传递的值。形参在函数体内可以像普通变量一样使用。实参则是在调用函数时实际传递给函数的值,这些值会被复制到对应的形参中。
 

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

#include <stdio.h>

// 函数声明,x 和 y 是形参
int add(int x, int y);

int main() {
    int a = 5, b = 3;
    int result;
    
    // 函数调用,a 和 b 是实参
    result = add(a, b);
    
    printf("结果:%d\n", result);
    
    return 0;
}

// 函数定义
int add(int x, int y) {
    return x + y;
}

在这个例子中,add 函数的定义中 x 和 y 是形参,它们在函数被调用时会接收实际的值。而在 main 函数中,我们调用 add 函数时传递的 a 和 b 就是实参。


形参和实参之间存在着密切的关系。当我们调用函数时,实参的值会被复制到对应的形参中,这意味着在函数内部对形参的修改不会影响到实参的值。这种参数传递方式被称为“值传递”。


为了更好地理解这一点,让我们看一个稍微复杂一点的例子:

#include <stdio.h>

void swap(int x, int 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;
}

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

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

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

从输出结果我们可以看到,尽管在 swap 函数内部 x 和 y 的值发生了交换,但是 main 函数中的 a 和 b 的值并没有改变。这就是因为C语言中函数参数的传递采用的是值传递机制。
 

在实际编程中,我们经常需要在函数内部修改传入的参数值,并且希望这些修改能够反映到函数外部,这时,我们可以使用指针作为函数参数。通过指针,我们可以在函数内部直接访问和修改原始变量的值。

让我们修改上面的 swap 函数,使用指针来实现真正的交换:

#include <stdio.h>

void swap(int *x, int *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;
}

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

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

交换前:a = 10, b = 20
在 swap 函数内:*x = 20, *y = 10
交换后:a = 20, b = 10

这次,我们成功地在函数内部交换了变量的值,并且这个改变反映到了 main 函数中。这是因为我们传递了变量的地址(使用 & 运算符),而不是变量的值。在 swap 函数内部,我们使用指针来访问和修改这些地址所指向的值。
 

在使用形参和实参时,我们还需要注意以下几点:

 

理解并正确使用形参和实参是编写高质量C语言程序的基础,在实际编程中,要根据具体需求选择合适的参数传递方式,灵活运用值传递和指针传递,以实现预期的功能。

相关文章