该文章Github地址:https://github.com/AntonyCheng/c-notes
在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址:https://blog.csdn.net/AntonyCheng/article/details/136555245),该模板集成了最常见的开发组件,同时基于修改配置文件实现组件的装载,除了这些,模板中还有非常丰富的整合示例,同时单体架构也非常适合SpringBoot框架入门,如果觉得有意义或者有帮助,欢迎Star & Issues & PR!
上一章:由浅到深认识C语言(4):数组
4.函数
4.1.示例的概述
//函数的声明:告诉编译器该函数存在
void my_fun();
int main(int argc, char* argv[]) {
//函数的调用:函数名 +()
my_fun();
return 0;
}
//函数的定义,如果将函数定义放在函数调用上方,就可以省略函数的声明,但是不建议这样做
void my_fun() {
printf("my fun\n");
return;//return可以返回函数结果,也可以结束函数
}
-
函数的概述
C语言是由函数组成,函数是程序的基本模块,通过对函数模块得调用实现特定的功能;
-
函数的分类
{ 库 函 数 : 编 译 器 提 供 的 可 在 C 源 程 序 中 调 用 的 函 数 { C 语 言 标 准 库 规 定 的 库 函 数 编 译 器 提 供 的 库 函 数 用 户 自 定 义 函 数 : 用 户 把 自 己 的 算 法 编 成 相 对 独 立 的 函 数 模 块 , 通 过 调 用 的 方 法 来 使 用 \begin{cases} \bf{库函数:编译器提供的可在C源程序中调用的函数}\begin{cases} \bf{C语言标准库规定的库函数}\\\bf{编译器提供的库函数} \end{cases} \\\bf{用户自定义函数:用户把自己的算法编成相对独立的函数模块,通过调用的方法来使用} \end{cases} ⎩⎪⎨⎪⎧库函数:编译器提供的可在C源程序中调用的函数{C语言标准库规定的库函数编译器提供的库函数用户自定义函数:用户把自己的算法编成相对独立的函数模块,通过调用的方法来使用 -
函数的定义
实现函数功能,确定函数体、返回值、形参,让函数存在;
返回值类型 函数名(形参类型 形参){ 函数体; }
- 返回值类型:函数将来返回值的类型;
- 函数名:函数的入口地址;
- 形参:函数外部数据传递到函数内部的桥梁;
- 函数体:函数的具体功能;
-
函数的声明
不是实现函数功能,仅仅是说明该函数有声明返回值类型,形参类型,函数名;
返回值类型 函数名(形参类型 形参);
-
函数的调用
函数的执行;
函数名(实参);
实参:函数外部的实际数据
4.2.函数的参数
-
如果函数没有参数,请将形参写成
void
;void my_fun(void); int main(int argc, char* argv[]) { //下方就不要传参 my_fun(); return 0; } //如果函数没写形参,在调用的时候可以传实参,只是实参得不到使用 void my_fun(void) { printf("my fun\n"); return; }
-
函数参数的传递;
int my_fun(int x,int y); int main(int argc, char* argv[]) { int data1 = 10; int data2 = 20; int ret = my_fun(data1,data2); printf("ret = %d", ret); return 0; } int my_fun(int x,int y) { return x + y; }
图示如下:
-
注意
-
函数的形参的本质是函数的局部变量;
int my_fun(int x,int y) { return x + y; }
即
x
和y
是函数的形式参数; -
形参在函数定义的时候不会开辟空间;
这是为了防止函数不调用时占电脑内存,但是当函数调用的时候就会开辟空间;
-
形参在函数结束的时候才会被释放;
-
函数名代表的是函数的入口地址;
-
函数的返回值小于等于4B,那么存放到寄存器中,否则存放在栈区;
-
4.3.案例
案例一:用函数的方式求取数组的最大值和最小值;
void arr_brith(int arr[5], int n);
void arr_print(int arr[5], int n);
int arr_max(int arr[5],int n);
int arr_min(int arr[5],int n);
int main(int argc, char* argv[]) {
int arr[5] = { 0 };
int max = 0, min = 0;
int n = sizeof(arr) / sizeof(arr[0]);
printf("这是一个从%d个数字中挑选出最大值最小值的程序\n",n);
//键盘输入数组
arr_brith(arr,n);
//确认并遍历
arr_print(arr, n);
//计算数组的最大值
arr_max(arr, n);
//计算数组的最小值
arr_min(arr, n);
}
void arr_brith(int arr[5], int n) {
int i = 0;
printf(" 请输入需要比较的%d个整数:\n",n);
for (i = 0; i < n; i++) {
scanf_s("%d", &arr[i]);
}
}
void arr_print(int arr[5], int n) {
int i = 0;
printf(" 您输入的整数是: \n");
for (i = 0; i < n; i++) {
printf(" %d ", arr[i]);
}
printf("\n");
}
int arr_max(int arr[5],int n) {
int tmp_max = arr[0]; //假设第 0 个元素是最大的
int i = 0;
for (i = 0; i < n; i++) {
if (tmp_max <= arr[i]) {
tmp_max = arr[i];
}
}
printf(" 该数组最大值为%d\n", tmp_max);
return 0;
}
int arr_min(int arr[5],int n) {
int tmp_min = arr[0]; //假设第 0 个元素是最小的
int i = 0;
for (i = 0; i < n; i++) {
if (tmp_min >= arr[i]) {
tmp_min = arr[i];
}
}
printf(" 该数组最小值为%d\n", tmp_min);
return 0;
}
打印效果如下:
案例二:键盘输入 5 个int数值,对其从小到大排序,用函数封装;
void input(int arr[5],int n);
void compare(int arr[5], int n);
void print(int arr[5]);
int main(int argc, char* argv[]) {
int arr[5] = { 0 };
int n = sizeof(arr) / sizeof(arr[0]);
input(arr,n);
compare(arr, n);
print(arr);
}
void input(int arr[5],int n) {
int i = 0;
for (i = 0; i < n; i++) {
printf("请输入第 %d 个数:", i + 1);
scanf_s("%d", &arr[i]);
}
}
void compare(int arr[5],int n) {
int i = 0;
int j = 0;
int count = 0;
for (i = 0; i < n; i++) {
for (j = i; j < n; j++) {
if (arr[i] <= arr[j + 1]) {
count = arr[i];
arr[i] = arr[j + 1];
arr[j + 1] = count;
}
}
}
}
void print(int arr[5]) {
int i = 0;
printf("\n排序之后得:\n");
for (i = 4; i >= 0; i--) {
printf(" %d ", arr[i]);
}
}
打印效果如下:
案例三:键盘输入一个字符串 "abcdef"
进行前后的颠倒 ----> "fedcba"
,用函数封装;
void my_input(char str[100]);
void my_print(char str[100], int n);
void my_print(char str[100], int n);
void my_fun(char str[100], int n);
int main(int argc, char* argv) {
char str[100] = { "" };
int n = sizeof(str) / sizeof(str[0]);
my_input(str);
my_print(str, n);
printf("\n");
my_fun(str, n);
return 0;
}
void my_input(char str[100]) {
printf("请输入少于100个字符的英文:");
scanf_s("%s", str, 100);
return;
}
void my_print(char str[100],int n) {
int i = 0;
printf("你输入的字符串如下:\n");
for (i = 0; i < n; i++) {
printf("%c", str[i]);
}
return;
}
void my_fun(char str[100], int n) {
printf("这串字符颠倒之后得:\n");
int i = 0;
for (i = n - 1; i >= 0; i--) {
if (str[i] == -2) {
continue;
}
printf("%c", str[i]);
}
return;
}
打印效果如下: