首页 > 编程笔记 > C语言笔记 阅读:173

C语言函数的形参和实参(非常详细,附带实例)

在 C语言程序中,函数通常接收一些数据,执行某些操作,然后返回一个结果。比如,C语言标准库中的 printf() 就是一个函数,它接收我们要输出的内容,并在屏幕上显示出来。


函数接收数据是借助形参(形式参数)和实参(实际参数)实现的,简单来说:

形参和实参的基本用法

让我们通过一个简单的例子来看看形参和实参如何工作:

#include <stdio.h>

int add(int a, int b) {  // a 和 b 是形参
    return a + b;
}

int main() {
    int x = 3, y = 5;
    int sum = add(x, y);  // x 和 y 是实参
    printf("Sum = %d\n", sum);
    return 0;
}

输出结果:

Sum = 8

在这个例子中:


形参 a 和 b 在函数内部接收了实参的值,计算后返回结果。

形参和实参的匹配规则

在 C语言中,形参和实参之间有一些严格的匹配规则,确保函数能够正确工作。具体要求如下:

1. 数量匹配:形参和实参的个数必须一致。
2. 类型匹配:实参的类型应与形参的类型一致,或者能够自动转换为形参类型。
3. 顺序匹配:实参的顺序必须与形参的顺序对应。

例如,如果函数定义了两个形参,而调用时只传入一个实参,编译器会报错。

来看一个错误的例子:

int add(int a, int b) { return a + b; }
int main() { add(5); }  // 错误:缺少一个实参


再看一个类型不匹配的例子:

#include <stdio.h>

void printNumber(int n) {
    printf("Number: %d\n", n);
}

int main() {
    printNumber("Hello");  // 类型不匹配:字符串无法自动转为整数
    return 0;
}

这里会导致编译错误或未定义行为,因为字符串无法直接作为整数传入。

实参的多样性

实参不仅可以是变量,还可以是常量、表达式,甚至其他函数的调用结果。例如:

#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

int main() {
    printf("Sum = %d\n", add(3, 4));          // 常量作为实参
    printf("Sum = %d\n", add(2 + 1, 5));      // 表达式作为实参
    printf("Sum = %d\n", add(add(1, 2), 3));  // 函数调用结果作为实参
    return 0;
}

输出结果:

Sum = 7
Sum = 8
Sum = 6 
这些实参在传入时会被计算为具体的值,然后赋值给形参。C语言的灵活性使得函数调用非常强大。

函数参数的值传递

C语言中,形参和实参之间的数据传递采用的是值传递(Pass by Value)。这意味着,实参的值会被复制一份给形参,函数内部对形参的修改不会影响实参的原始值。

来看一个例子:

#include <stdio.h>

void change(int x) {
    x = 10;
}

int main() {
    int a = 5;
    change(a);
    printf("a = %d\n", a);
    return 0;
}

输出结果:

a = 5

在这个例子中,a 是实参,值是 5。调用 change(a) 时,a 的值被复制给形参 x。函数内部将 x 改为 10,但这只是修改了 x 的副本,a 的值依然是 5。
 

这种机制的好处是保护了原始数据,但如果确实需要修改实参,可以通过指针实现。这时,实参是变量的地址,形参是指针类型。来看一个例子:

#include <stdio.h>

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

int main() {
    int a = 3, b = 5;
    swap(&a, &b);
    printf("a = %d, b = %d\n", a, b);
    return 0;
}

输出结果:

a = 5, b = 3

在这里,实参 &a 和 &b 是变量的地址,形参 x 和 y 是指针。函数通过解引用操作 *x 和 *y,直接修改了 a 和 b 的值。

形参和实参的常见问题

下面是新手小白学习函数形参和实参过程中经常遇到的问题。

1) 形参名和实参名可以一样吗?

形参和实参的名称可以相同,但没必要。形参是函数内部的局部变量,与实参的名称无关。

2) 实参一定是变量吗?

不一定,可以是常量、表达式或函数调用结果,只要类型匹配即可。

3) 形参未在函数内部使用会怎样?

编译器可能警告“未使用变量”,但不会影响程序运行。

相关文章