6.1 函数的定义与声明
1. 函数的定义
函数定义是指编写函数的具体实现部分,包括函数的返回类型、函数名、参数列表和函数体。
基本形式:
返回类型 函数名(参数类型 参数名, ...) {
// 函数体
// 需要执行的代码
return 返回值; // 如果有返回值
}
示例:
#include <stdio.h>
// 函数定义
int add(int a, int b) {
return a + b; // 返回两个整数的和
}
int main() {
int sum = add(5, 3); // 函数调用
printf("Sum is: %d\n", sum);
return 0;
}
2. 函数的声明
函数声明是指在使用函数之前告诉编译器函数的返回类型、函数名和参数类型。函数声明通常放在文件的顶部或头文件中。
基本形式:
返回类型 函数名(参数类型, ...);
示例:
#include <stdio.h>
// 函数声明
int add(int, int);
int main() {
int sum = add(5, 3); // 函数调用
printf("Sum is: %d\n", sum);
return 0;
}
// 函数定义
int add(int a, int b) {
return a + b;
}
6.2 函数参数传递
函数的参数传递有两种方式:值传递和引用传递(实际上是地址传递)。
1. 值传递
在值传递中,将参数的副本传递给函数。函数内的操作不影响原始参数。
示例:
#include <stdio.h>
void modifyValue(int x) {
x = 100; // 修改的是副本,不影响原始变量
}
int main() {
int a = 10;
modifyValue(a);
printf("a after modifyValue: %d\n", a); // 输出仍然是10
return 0;
}
2. 引用传递(地址传递)
在引用传递中,将参数的地址传递给函数。函数内的操作可以影响原始参数。
示例:
#include <stdio.h>
void modifyValue(int *x) {
*x = 100; // 修改的是地址对应的实际变量
}
int main() {
int a = 10;
modifyValue(&a);
printf("a after modifyValue: %d\n", a); // 输出为100
return 0;
}
6.3 函数返回值
函数可以返回一个值,也可以不返回值。void
类型的函数表示不返回任何值。
1. 返回值
函数的返回类型决定了它能返回什么样的值。
示例:
#include <stdio.h>
// 返回整数的函数
int getMax(int a, int b) {
if (a > b) {
return a;
} else {
return b;
}
}
int main() {
int max = getMax(10, 20);
printf("Max value is: %d\n", max);
return 0;
}
2. 无返回值的函数
如果函数不需要返回任何值,可以使用void
作为返回类型。
示例:
#include <stdio.h>
// 不返回任何值的函数
void printHello() {
printf("Hello, World!\n");
}
int main() {
printHello(); // 调用无返回值函数
return 0;
}
6.4 递归函数
递归函数是指在函数的定义中调用该函数自身。递归函数在解决问题时,通常将问题分解为更小的相同类型的问题。
示例:计算阶乘
#include <stdio.h>
// 递归函数计算阶乘
int factorial(int n) {
if (n == 0) {
return 1; // 基本情况:0! = 1
} else {
return n * factorial(n - 1); // 递归情况
}
}
int main() {
int num = 5;
printf("Factorial of %d is: %d\n", num, factorial(num));
return 0;
}
6.5 内联函数
在C语言中,内联函数可以通过inline
关键字定义,建议编译器将函数调用扩展为函数体,以减少函数调用的开销。
注意:内联函数是一种优化建议,编译器可以选择忽略。
示例:
#include <stdio.h>
// 内联函数
inline int square(int x) {
return x * x;
}
int main() {
int num = 5;
printf("Square of %d is: %d\n", num, square(num));
return 0;
}
练习
- 编写一个函数,计算两个整数的最大公约数(GCD)。
- 编写一个递归函数,计算斐波那契数列的第
n
个数。 - 编写一个函数,传入一个数组和数组的大小,返回数组中最大元素的值。
- 编写一个程序,使用
inline
函数计算两个数的乘积。
完成这些练习后,你将对C语言中的函数有深入的理解。