MST
星途 面试题库

面试题:C语言函数的参数传递机制

请详细阐述C语言中函数参数传递的两种主要方式(值传递和指针传递),并举例说明它们在内存操作和数据修改上有何不同。
50.4万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

值传递

  1. 概念:在值传递中,函数接收的是调用者传递的参数值的副本。函数内部对这些参数的任何修改都只影响副本,而不会改变调用者提供的原始值。
  2. 内存操作:当函数被调用时,为形参分配新的内存空间,这些形参的值初始化为实参的值。
  3. 数据修改:函数内部对形参的修改不会影响实参。

示例代码

#include <stdio.h>

void swapValue(int a, int b) {
    int temp;
    temp = a;
    a = b;
    b = temp;
}

int main() {
    int num1 = 5, num2 = 10;
    printf("Before swapValue: num1 = %d, num2 = %d\n", num1, num2);
    swapValue(num1, num2);
    printf("After swapValue: num1 = %d, num2 = %d\n", num1, num2);
    return 0;
}

在上述代码中,swapValue 函数接收 num1num2 的副本 ab,函数内交换 ab 的值,但 num1num2 的原始值并未改变。

指针传递

  1. 概念:指针传递时,函数接收的是调用者传递的变量的内存地址。通过这个地址,函数可以直接访问和修改调用者提供的原始数据。
  2. 内存操作:形参是指针变量,它存储的是实参的内存地址。函数通过这个地址访问实参所在的内存空间。
  3. 数据修改:函数内部对指针所指向的数据的修改会直接影响实参。

示例代码

#include <stdio.h>

void swapPointer(int *a, int *b) {
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int num1 = 5, num2 = 10;
    printf("Before swapPointer: num1 = %d, num2 = %d\n", num1, num2);
    swapPointer(&num1, &num2);
    printf("After swapPointer: num1 = %d, num2 = %d\n", num1, num2);
    return 0;
}

在上述代码中,swapPointer 函数接收 num1num2 的地址,通过指针间接访问并修改 num1num2 的值,因此 num1num2 的值在函数调用后发生了交换。

总结

  • 值传递适用于函数不需要修改调用者提供的原始数据的情况,其优点是简单直观,缺点是如果传递的数据量较大,会消耗较多内存。
  • 指针传递适用于需要在函数内部修改调用者数据的场景,通过传递地址可以提高效率,避免数据的重复拷贝,但使用指针需要更加小心,防止空指针等错误。