由浅到深认识C语言(5):函数

该文章Github地址:https://github.com/AntonyCheng/c-notes【有条件的情况下推荐直接访问GitHub以获取最新的代码更新】

在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template【有条件的情况下推荐直接访问GitHub以获取最新的代码更新】& 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语言标准库规定的库函数编译器提供的库函数用户自定义函数:用户把自己的算法编成相对独立的函数模块,通过调用的方法来使用

  • 函数的定义

    实现函数功能,确定函数体、返回值、形参,让函数存在;

    返回值类型 函数名(形参类型 形参){
    	函数体;
    }
    
    1. 返回值类型:函数将来返回值的类型;
    2. 函数名:函数的入口地址;
    3. 形参:函数外部数据传递到函数内部的桥梁;
    4. 函数体:函数的具体功能;
  • 函数的声明

    不是实现函数功能,仅仅是说明该函数有声明返回值类型,形参类型,函数名;

    返回值类型 函数名(形参类型 形参);
    
  • 函数的调用

    函数的执行;

    函数名(实参);
    

    实参:函数外部的实际数据

4.2.函数的参数

  1. 如果函数没有参数,请将形参写成 void

    void my_fun(void);
    int main(int argc, char* argv[]) {
        //下方就不要传参
    	my_fun();
    	return 0;
    }
    //如果函数没写形参,在调用的时候可以传实参,只是实参得不到使用
    void my_fun(void) {
    	printf("my fun\n");
    	return;
    }
    
  2. 函数参数的传递;

    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;
    }
    

    图示如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  3. 注意

    • 函数的形参的本质是函数的局部变量;

      int my_fun(int x,int y) {
      	return x + y;
      }
      

      xy 是函数的形式参数;

    • 形参在函数定义的时候不会开辟空间;

      这是为了防止函数不调用时占电脑内存,但是当函数调用的时候就会开辟空间;

    • 形参在函数结束的时候才会被释放;

    • 函数名代表的是函数的入口地址;

    • 函数的返回值小于等于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;
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下一章:由浅到深认识C语言(6):变量的存储类型

  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值