目录
1.函数的基本概念
1.1.函数的定义与声明
函数是编程中的基本构建块,用于封装可重用的代码。函数的定义包括指定函数的名称、参数列表、返回类型以及函数体。函数的声明通常出现在代码的顶部,用于告诉编译器函数的存在及其签名。
// 函数声明
int add(int a, int b);
// 函数定义
int add(int a, int b) {
return a + b;
}
1.2.函数的组成部分
函数的组成部分包括返回类型、函数名、参数列表和函数体。
- 返回类型:指定函数返回的数据类型。如果函数不返回任何值,则返回类型为
void
。 - 函数名:函数的标识符,用于调用函数。
- 参数列表:函数接受的输入参数,每个参数包括类型和名称。
- 函数体:包含函数执行的代码块。
// 返回类型:int
// 函数名:multiply
// 参数列表:int a, int b
// 函数体:{ return a * b; }
int multiply(int a, int b) {
return a * b;
}
1.3.函数的调用与返回值
函数通过函数名和参数列表进行调用。调用函数时,程序会执行函数体中的代码,并返回指定的值。
#include <stdio.h>
// 函数声明
int add(int a, int b);
int main() {
int result = add(3, 4); // 函数调用
printf("Result: %d\n", result); // 输出返回值
return 0;
}
// 函数定义
int add(int a, int b) {
return a + b; // 返回值
}
在上述示例中,add
函数被调用,并返回两个整数的和。返回值被存储在 result
变量中,并通过 printf
函数输出。
2.函数的分类
2.1 库函数与用户自定义函数
定义与示例:
// 库函数示例(数学函数)
#include <math.h>
double y = sqrt(9.0); // 调用sqrt()库函数
// 用户自定义函数
int custom_max(int a, int b) {
return (a > b) ? a : b;
}
特点对比:
- 库函数:预编译在标准库中(如stdio.h, math.h),直接调用
- 用户自定义函数:开发者按需编写,解决特定问题
库函数的学习和查看⼯具很多,⽐如:
C/C++官⽅的链接:
https://zh.cppreference.com/w/c/header
cplusplus.com:
https://legacy.cplusplus.com/reference/clibrary/
2.2 无参函数与有参函数
语法结构:
// 无参函数
void welcome() {
printf("欢迎使用系统");
}
// 有参函数
float circle_area(float r) {
return 3.14159 * r * r;
}
- 值传递:单向传递(默认方式)
- 地址传递:通过指针操作内存
2.3 有返回值函数与无返回值函数
返回值类型:
// 有返回值函数
int factorial(int n) {
return (n <= 1) ? 1 : n * factorial(n-1);
}
// 无返回值函数
void show_menu() {
printf("1.新建\n2.打开\n3.退出");
}
- void类型函数不可包含return语句(空return除外)
- 返回值类型必须与声明一致
3.函数的参数传递
3.1 值传递与地址传递
值传递将实参的副本传给形参,函数内修改不影响原始变量:
void square(int x) {
x = x * x; // 修改不影响外部变量
}
地址传递通过传递内存地址实现数据修改:
void square_ptr(int *x) {
*x = (*x) * (*x); // 解引用修改原始数据
}
3.2 指针作为函数参数
典型应用场景:交换两个变量的值
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 调用方式
int x=5, y=10;
swap(&x, &y); // x=10, y=5
内存示意图:
调用前:
x(0x1000) -> 5
y(0x1004) -> 10
指针参数:
a -> 0x1000
b -> 0x1004
3.3 数组作为函数参数
数组参数本质是指针传递,以下两种声明等效:
void print_array(int arr[], int size);
void print_array(int *arr, int size);
示例:计算数组平均值
float average(int arr[], int n) {
float sum = 0;
for(int i=0; i<n; i++) {
sum += arr[i]; // arr[i]等价于*(arr+i)
}
return sum/n;
}
参数传递对比表
类型 | 传递内容 | 内存开销 | 可修改性 |
---|---|---|---|
基本类型值传递 | 值副本 | 大 | 不可修改原值 |
指针参数 | 地址值 | 小 | 可修改目标内存 |
数组参数 | 首地址 | 小 | 可修改数组元素 |
注:当结构体较大时,建议使用指针传递避免拷贝开销
示例代码
#include <stdio.h>
// 函数声明
int add(int a, int b);
int main() {
int result = add(3, 4);
printf("Result: %d\n", result);
return 0;
}
// 函数定义
int add(int a, int b) {
return a + b;
}