Skip to content

函数

函数是指一段可重用的代码块,它接收零个或多个输入参数,并输出一个返回值。函数使得程序模块化,易于编写、调试和维护。

定义和声明

函数包含函数头和函数体两部分。函数头包括函数的返回类型、函数名和参数列表。函数体包含一组语句,定义了函数要执行的操作。

c
int sum(int a, int b) {
    return a + b;
}

上述代码定义了一个名为add的函数,它接受两个整数作为参数并返回它们的和。

函数声明告诉编译器函数的返回类型、函数名和参数列表,函数声明可以放在代码的开头,也可以放在使用函数的地方之前。

c
int sum(int a, int b);

函数调用

函数的调用是通过函数名和传递给函数的实际参数来实现的。调用函数时,将实际参数传递给函数的形式参数。

c
int result = add(2, 3);

上述代码调用了之前定义的 add 函数,并将参数2和3传递给它。函数执行完成后,返回值被赋值给变量 result。

函数的返回值

函数的返回类型在函数头中指定,例如上述的 int 返回类型。函数也可以不需要返回值,此时可以将返回类型设置为 void。

函数参数

函数可以接受参数,用于向函数传递数据。函数参数在函数头的参数列表中声明。函数参数可以是基本数据类型(如整数、浮点数等)或指针类型。参数可以在函数内部使用,进行计算或处理。

函数可以按值传递参数或按引用传递参数。按值传递参数时,函数接收参数的值副本。按引用传递参数时,函数接收参数的地址,可以直接操作该地址上的值。

按值传递

c
int square(int num) {
    return num * num;
}

int main() {
    int result = square(5);
    printf("The square of 5 is %d", result);
    return 0;
}

这个程序将打印出字符串 "The square of 5 is 25"。在这个例子中,我们定义了一个函数 square,它接收一个整数参数并返回该参数的平方。我们通过调用 square 函数来计算 5 的平方,并将结果打印到控制台上。

按引用传递

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

int main() {
    int x = 5, y = 7;
    printf("Before swap: x=%d, y=%d\n", x, y);
    swap(&x, &y);
    printf("After swap: x=%d, y=%d", x, y);
    return 0;
}

这个程序将打印出字符串 "Before swap: x=5, y=7\nAfter swap: x=7, y=5"。在这个例子中,我们定义了一个函数 swap,它接收两个指向整数的指针参数,并交换它们所指向的值。我们通过调用 swap 函数来交换变量 x 和 y 的值。

作用域

变量的作用域指定了该变量在哪些区域内可见。C 语言中,变量的作用域由花括号({})界定的代码块确定。

函数内部可以定义局部变量,这些变量只在函数内部可见。局部变量在函数被调用时创建,在函数执行完毕后销毁。

c
int add(int a, int b) {
    int sum = a + b;
    int product = a * b;
    return sum;
}

上述代码中的 sum 和 product 是 add 函数的局部变量。

全局变量是在函数外部定义的变量,可以在程序的任何地方访问。全局变量在程序开始执行时创建,在程序结束时销毁。

c
#include <stdio.h>

int globalVar = 10;

void printGlobalVar() {
    printf("Global variable: %d\n", globalVar);
}

int main() {
    printf("Global variable: %d\n", globalVar);
    globalVar = 20;
    printGlobalVar();
    return 0;
}

上述代码中的 globalVar 是一个全局变量。它可以在 main 函数和 printGlobalVar 函数中访问。

可变参数

在 C 语言中,可以定义可变参数的函数。可变参数指的是函数可以接收不定数量的参数。比如我们经常使用的打印函数 printf()。

c
int printf(const char *format, ...);

其中,第一个参数 format 是格式化字符串,后面的 ... 表示可变数量的参数列表。在实际使用中,我们可以根据需要传递任意数量和类型的参数,以满足不同的输出需求。

printf() 函数的返回值为输出到控制台的字符数,如果出现错误则返回负数。因此,我们可以通过判断函数的返回值来确定输出是否成功。

另外,需要注意的是,在使用可变参数的函数中,必须保证可变参数与函数期望类型一致,并且调用函数时提供足够数量的参数。否则,函数可能会产生未定义的行为。

函数的递归

递归是指函数调用自身的过程。使用递归可以解决一些需要重复执行的问题。

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

上述代码中的 factorial 函数使用递归计算一个数的阶乘。

递归函数必须包含一个终止条件,以避免无限递归。在上述代码中,当 n 为 0 或 1 时,递归停止。

函数指针

在 C 语言中,函数指针是指向函数的指针变量。函数指针可以作为参数传递给其他函数,也可以作为函数的返回值。

c
#include <stdio.h>
int add(int a, int b) {
    return a + b;
}
int main() {
    int (*ptr)(int, int) = &add;
    int result = ptr(5, 7);
    printf("Result is %d", result);
    return 0;
}

这个程序将打印出字符串 "Result is 12"。在这个例子中,我们定义了一个函数指针 ptr,它指向一个接受两个整数参数并返回一个整数的函数。我们将其赋值为 add 函数的地址,并使用指针调用该函数。

总结

本篇文章围绕着函数在 C 语言中的基本概念、函数的定义和调用、参数传递、作用域、递归、函数指针等方面进行了讲述。理解和掌握这些概念是编写高质量 C 语言程序的关键之一。

Released under the MIT License.