6.1 函数定义与声明

在C语言中,函数是执行特定任务的一系列代码。要使用一个函数,首先需要对其进行声明,然后定义。

6.1.1 函数声明

函数声明告诉编译器函数的名称、返回类型以及参数列表。其基本语法如下:

返回类型 函数名(参数类型 参数名, 参数类型 参数名, ...);

例如:

int add(int a, int b);

6.1.2 函数定义

函数定义包含了函数体,即函数的具体实现。其基本语法如下:

返回类型 函数名(参数类型 参数名, 参数类型 参数名, ...) {
    // 函数体
}

例如:

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

6.2 参数传递

在C语言中,函数可以通过值传递和引用传递来传递参数。

6.2.1 值传递

值传递是将实参的值复制到形参中。这意味着形参的任何修改都不会影响实参。

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

int main() {
    int x = 10, y = 20;
    swap(x, y);
    // x 和 y 的值仍然是 10 和 20
}

6.2.2 引用传递

引用传递是通过指针实现的。这意味着形参和实参指向同一内存地址,任何对形参的修改都会影响实参。

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

int main() {
    int x = 10, y = 20;
    swap(&x, &y);
    // x 和 y 的值现在是 20 和 10
}

6.3 函数递归

函数递归是指函数在执行过程中调用自身。递归通常用于解决可以分解为子问题的问题。

int factorial(int n) {
    if (n == 0)
        return 1;
    else
        return n * factorial(n - 1);
}

6.4 闭包与匿名函数

闭包是一种包含自由变量的函数。匿名函数是一种没有名称的函数。

6.4.1 闭包

int multiplier = 2;

int double(int x) {
    return x * multiplier;
}

// double 函数是一个闭包,因为它使用了自由变量 multiplier

6.4.2 匿名函数

int (*create_multiplier(int factor))(int) {
    return [factor](int x) { return x * factor; };
}

int main() {
    int (*double_val)(int) = create_multiplier(2);
    int result = double_val(10);
    // result 的值为 20
}

6.5 函数指针

函数指针是指向函数的指针。它们可以用于传递函数作为参数或返回函数。

6.5.1 函数指针作为参数

void print(const char *str) {
    printf("%s\n", str);
}

int main() {
    const char *message = "Hello, World!";
    print(message);
    // 输出: Hello, World!
}

6.5.2 函数指针作为返回值

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

int main() {
    int (*sum)(int, int) = add;
    int result = sum(2, 3);
    // result 的值为 5
}

通过以上内容,我们可以深入了解C语言函数的精髓。掌握这些关键点将有助于我们更好地编写高效的C语言程序。