函数详解
嗨,我是长安!
函数是我当年学C语言时的一个转折点。一旦掌握了函数,你会发现代码变得特别整洁,再也不用重复写相同的代码了。
函数就像一个"小工具",可以重复使用,让代码更简洁!
为什么需要函数?
没有函数的代码
// 计算面积要写3次!
int area1 = 10 * 20;
int area2 = 5 * 8;
int area3 = 15 * 12;
有了函数
int calculateArea(int length, int width) {
return length * width;
}
int area1 = calculateArea(10, 20);
int area2 = calculateArea(5, 8);
int area3 = calculateArea(15, 12);
优点:
- ✅ 代码重用(我现在特别喜欢这个)
- ✅ 易于维护(改一处就行)
- ✅ 逻辑清晰(代码看着舒服)
函数的定义
基本语法
返回类型 函数名(参数列表) {
// 函数体
return 返回值;
}
示例
#include <stdio.h>
// 函数定义
int add(int a, int b) {
int sum = a + b;
return sum;
}
int main() {
int result = add(5, 3); // 函数调用
printf("5 + 3 = %d\n", result);
return 0;
}
函数的组成部分
int add(int a, int b) {
return a + b;
}
int- 返回类型add- 函数名int a, int b- 参数列表return a + b- 返回值
无返回值函数(void)
#include <stdio.h>
void printHello() {
printf("Hello, World!\n");
// 不需要return
}
void printLine() {
printf("===================\n");
}
int main() {
printLine();
printHello();
printLine();
return 0;
}
无参数函数
#include <stdio.h>
int getRandomNumber() {
return 42; // 假装是随机数😄
}
int main() {
int num = getRandomNumber();
printf("随机数:%d\n", num);
return 0;
}
函数原型(声明)
函数使用前必须先声明或定义:
方法1:函数定义在main前面
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main() {
printf("%d\n", add(5, 3));
return 0;
}
方法2:使用函数原型
#include <stdio.h>
// 函数声明(原型)
int add(int a, int b);
int main() {
printf("%d\n", add(5, 3));
return 0;
}
// 函数定义可以在后面
int add(int a, int b) {
return a + b;
}
参数传递
值传递
C语言的参数传递是值传递(复制):
#include <stdio.h>
void changeValue(int x) {
x = 100;
printf("函数内:x = %d\n", x);
}
int main() {
int num = 10;
changeValue(num);
printf("函数外:num = %d\n", num); // num还是10
return 0;
}
输出:
函数内:x = 100
函数外:num = 10
长安的经验
想象你给朋友一张照片的复印件,他在复印件上涂画,不会影响你的原件。
我当年就是用这个比喻理解的值传递!
实战案例
案例1:判断素数
#include <stdio.h>
#include <stdbool.h>
bool isPrime(int n) {
if (n < 2) return false;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
int main() {
for (int i = 1; i <= 20; i++) {
if (isPrime(i)) {
printf("%d ", i);
}
}
printf("\n");
return 0;
}
案例2:求最大值
#include <stdio.h>
int max(int a, int b) {
return (a > b) ? a : b;
}
int max3(int a, int b, int c) {
return max(max(a, b), c);
}
int main() {
printf("最大值:%d\n", max(10, 20));
printf("三数最大:%d\n", max3(15, 8, 23));
return 0;
}
案例3:打印菜单
#include <stdio.h>
void printMenu() {
printf("\n=== 学生管理系统 ===\n");
printf("1. 添加学生\n");
printf("2. 删除学生\n");
printf("3. 查询学生\n");
printf("4. 退出系统\n");
printf("==================\n");
printf("请选择:");
}
int main() {
int choice;
while (1) {
printMenu();
scanf("%d", &choice);
if (choice == 4) {
printf("再见!\n");
break;
}
printf("你选择了选项%d\n", choice);
}
return 0;
}
案例4:计算器
#include <stdio.h>
float add(float a, float b) {
return a + b;
}
float subtract(float a, float b) {
return a - b;
}
float multiply(float a, float b) {
return a * b;
}
float divide(float a, float b) {
if (b == 0) {
printf("错误:除数不能为0\n");
return 0;
}
return a / b;
}
int main() {
float num1, num2;
char op;
printf("输入表达式(如:5 + 3):");
scanf("%f %c %f", &num1, &op, &num2);
float result;
switch (op) {
case '+':
result = add(num1, num2);
break;
case '-':
result = subtract(num1, num2);
break;
case '*':
result = multiply(num1, num2);
break;
case '/':
result = divide(num1, num2);
break;
default:
printf("无效运算符\n");
return 1;
}
printf("%.2f %c %.2f = %.2f\n", num1, op, num2, result);
return 0;
}
递归函数
函数可以调用自己!
阶乘示例
#include <stdio.h>
int factorial(int n) {
if (n == 0 || n == 1) {
return 1; // 基础情况
}
return n * factorial(n - 1); // 递归
}
int main() {
printf("5! = %d\n", factorial(5));
return 0;
}
斐波那契数列
#include <stdio.h>
int fibonacci(int n) {
if (n == 1 || n == 2) {
return 1;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
int main() {
for (int i = 1; i <= 10; i++) {
printf("%d ", fibonacci(i));
}
printf("\n");
return 0;
}
注意
递归要有终止条件,否则会无限循环!
变量作用域
局部变量
#include <stdio.h>
void func() {
int x = 10; // 局部变量
printf("func中的x:%d\n", x);
}
int main() {
int x = 20; // 另一个局部变量
printf("main中的x:%d\n", x);
func();
return 0;
}
全局变量
#include <stdio.h>
int globalVar = 100; // 全局变量
void printGlobal() {
printf("全局变量:%d\n", globalVar);
}
int main() {
printGlobal();
globalVar = 200;
printGlobal();
return 0;
}
练习题
练习1:计算幂
编写函数计算a的b次方。
练习2:判断回文数
判断一个数是否是回文数(如121)。
练习3:打印图案
用函数打印n行的星号三角形。
答案参考
查看答案
练习1:
#include <stdio.h>
int power(int base, int exp) {
int result = 1;
for (int i = 0; i < exp; i++) {
result *= base;
}
return result;
}
int main() {
printf("2^10 = %d\n", power(2, 10));
return 0;
}
练习2:
#include <stdio.h>
#include <stdbool.h>
bool isPalindrome(int num) {
int original = num;
int reversed = 0;
while (num > 0) {
reversed = reversed * 10 + num % 10;
num /= 10;
}
return original == reversed;
}
int main() {
int num = 121;
if (isPalindrome(num)) {
printf("%d是回文数\n", num);
} else {
printf("%d不是回文数\n", num);
}
return 0;
}
练习3:
#include <stdio.h>
void printTriangle(int n) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
printf("*");
}
printf("\n");
}
}
int main() {
printTriangle(5);
return 0;
}
知识点总结
- ✅ 函数定义:返回类型 + 函数名 + 参数
- ✅ void:无返回值
- ✅ 函数原型:提前声明
- ✅ 值传递:传递的是副本
- ✅ 递归:函数调用自己
- ✅ 作用域:局部变量和全局变量
下一步
👉 数组详解