一、函数的概念
函数是将一组语句放在一起执行一个特定任务的单元。C语言编程的所有程序都是由一个或多个函数组成的。函数是C语言程序中的基本模块,程序是通过调用函数来执行各种操作的。
在C语言中,一个函数由函数头和函数体组成。函数头的形式如下:
返回类型 函数名 (参数列表)
返回类型指定函数的返回值类型,由C语言数据类型中的任何一种取值。函数名是唯一标识函数的符号,用于调用函数。参数列表是传递给函数的参数列表,也就是函数要处理的数据。
二、函数的定义
C语言函数定义的一般形式如下:
返回类型 函数名 (参数列表) { 函数体 }
函数名由一个标识符组成,用于标识该函数。参数列表是由零个或多个参数组成的,每个参数是由其类型和名字组成的。函数体由一组语句组成,这些语句描述了函数执行的操作。
下面是一个简单的函数示例:
#includevoid print_message(void); int main() { print_message(); // 调用函数 return 0; } // 函数定义 void print_message(void) { printf("Hello World\n"); }
在上面的示例中,print_message()是函数名,该函数没有任何参数和返回值。函数被调用时,它会打印“Hello World”这个字符串。
三、函数的参数传递
C语言中函数可以使用参数传递数据。C语言中有两种参数传递方式:值传递和引用传递。
值传递是指传递参数的值,函数对参数进行操作不影响原始数据。下面是一个值传递的示例:
#includevoid swap(int x, int y); int main() { int a = 100; int b = 200; printf("交换前 a 的值:%d\n", a ); printf("交换前 b 的值:%d\n", b ); /* 调用函数来交换值 */ swap(a, b); printf("交换后 a 的值:%d\n", a ); printf("交换后 b 的值:%d\n", b ); return 0; } void swap(int x, int y) { int temp; temp = x; /* 保存 x 的值 */ x = y; /* 把 y 赋值给 x */ y = temp; /* 把原来的 x 值赋值给 y */ return; }
在上面的示例中,swap函数中的变量x和y与main函数中的a和b不是同一个变量。函数执行时,swap函数中的变量只是main函数中变量值的副本。swap函数中对x和y的操作不影响main函数中的a和b。
引用传递是指传递指针,函数可以通过指针修改原始数据。下面是一个引用传递的示例:
#include/* 函数声明 */ void swap(int *x, int *y); int main () { /* 局部变量定义 */ int a = 100; int b = 200; printf("交换前,a 的值:%d\n", a ); printf("交换前,b 的值:%d\n", b ); /* 调用函数来交换值 */ swap(&a, &b); printf("交换后,a 的值:%d\n", a ); printf("交换后,b 的值:%d\n", b ); return 0; } void swap(int *x, int *y) { int temp; temp = *x; /* 保存地址 x 的值 */ *x = *y; /* 把 y 赋值给 x */ *y = temp; /* 把 x 赋值给 y */ return; }
在上面的示例中,swap函数中的x和y是指向main函数中a和b的指针。函数中对指针的操作可以影响main函数中的a和b。
四、函数的返回值
函数可以有一个返回值,返回值的类型必须与函数声明的返回类型相同。下面是一个返回值的示例:
#include/* 函数声明 */ int max(int num1, int num2); int main () { /* 局部变量定义 */ int a = 100; int b = 200; int ret; /* 调用函数来获取最大值 */ ret = max(a, b); printf( "最大值是:%d\n", ret ); return 0; } /* 函数返回两个数中较大的那个数 */ int max(int num1, int num2) { /* 局部变量声明 */ int result; if (num1 > num2) result = num1; else result = num2; return result; }
在上面的示例中,max函数返回的是num1和num2中的最大值。main函数获取到返回值后,使用printf函数输出了返回值。
五、函数的递归
递归是指一个函数可以调用自身的行为。递归函数包含两个基本部分:递归调用和递归返回条件。下面是一个递归的示例:
#include/* 函数声明 */ unsigned long long fib(int n); int main() { int n = 9; printf("%d项斐波那契数列的值为:%lld\n", n, fib(n)); return 0; } /* 斐波那契数列的递归函数 */ unsigned long long fib(int n) { if (n == 0 || n == 1) return n; else return fib(n - 1) + fib(n - 2); }
上面的示例是斐波那契数列的递归函数。该函数可以计算第n项斐波那契数列的值。在函数中,当n为0或1时,递归结束。否则,递归调用函数本身计算n-1和n-2项斐波那契数列的值。