该文章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;
}
打印效果如下:



















