010. 理解函数参数的传递方式

在C语言中,函数参数的传递方式主要有两种:值传递(Pass by Value)地址传递(Pass by Address,也称为指针传递)。理解这两种参数传递方式对于编写高效且正确的C语言程序非常重要。

1. 值传递(Pass by Value)

值传递是指在调用函数时,将实际参数的值复制一份传递给函数的形参。在函数内部对形参的修改不会影响到实际参数。

示例代码

#include <stdio.h>

// 函数定义:值传递
void increment(int x) {
    x = x + 1; // 在函数内部修改形参x
    printf("Inside function: x = %d\n", x);
}

int main() {
    int a = 10;
    printf("Before function call: a = %d\n", a);
    increment(a); // 调用函数,传递a的值
    printf("After function call: a = %d\n", a);
    return 0;
}

输出结果

Before function call: a = 10
Inside function: x = 11
After function call: a = 10

解释

  • 在调用increment(a)时,a的值(10)被复制到形参x中。

  • 在函数内部,x被修改为11,但这不会影响到a的值。

  • 因此,函数调用后,a的值仍然是10。

2. 地址传递(Pass by Address)

地址传递是指在调用函数时,将实际参数的地址传递给函数的形参。在函数内部通过指针操作可以修改实际参数的值。

示例代码

#include <stdio.h>

// 函数定义:地址传递
void increment(int *x) {
    (*x)++; // 通过指针修改实际参数的值
    printf("Inside function: *x = %d\n", *x);
}

int main() {
    int a = 10;
    printf("Before function call: a = %d\n", a);
    increment(&a); // 调用函数,传递a的地址
    printf("After function call: a = %d\n", a);
    return 0;
}

输出结果

Before function call: a = 10
Inside function: *x = 11
After function call: a = 11

解释

  • 在调用increment(&a)时,a的地址被传递给形参x

  • 在函数内部,通过(*x)++操作,直接修改了a的值。

  • 因此,函数调用后,a的值被修改为11。

3. 值传递与地址传递的比较

值传递

  • 优点:简单,安全,不会修改实际参数的值。

  • 缺点:如果传递的是大型结构或数组,效率较低,因为需要复制整个数据。

地址传递

  • 优点:高效,尤其是对于大型数据结构,因为只传递地址。

  • 缺点:需要谨慎使用指针,否则可能导致程序错误(如野指针、内存泄漏等)。

4. 数组参数的传递

在C语言中,数组参数本质上也是通过地址传递的。当你将数组传递给函数时,实际上是传递了数组的首地址。

示例代码

#include <stdio.h>

// 函数定义:数组参数传递
void incrementArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        arr[i]++; // 直接修改数组元素
    }
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int size = sizeof(arr) / sizeof(arr[0]);

    printf("Before function call: ");
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    incrementArray(arr, size); // 调用函数,传递数组

    printf("After function call: ");
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

输出结果

Before function call: 1 2 3 4 5 
After function call: 2 3 4 5 6 

解释

  • 在调用incrementArray(arr, size)时,数组arr的首地址被传递给函数。

  • 在函数内部,通过arr[i]++操作,直接修改了数组的元素。

  • 因此,函数调用后,数组arr的值被修改。

视频讲解

BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)