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

该文章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使

  • 函数的定义

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

    返回值类型 函数名(形参类型 形参){
    	函数体;
    }
    
    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):变量的存储类型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/462387.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

湖南麒麟SSH服务漏洞

针对湖南麒麟操作系统进行漏洞检测时&#xff0c;会报SSH漏洞风险提醒&#xff0c;具体如下&#xff1a; 针对这些漏洞&#xff0c;可以关闭SSH服务&#xff08;前提是应用已经部署完毕不再需要通过SSH远程访问传输文件的情况下&#xff0c;此时可以通过VNC远程登录方法&#x…

Arduino IDE配置ESP8266开发环境

一、配置步骤 在Arduino IDE中配置ESP8266开发环境的详细步骤如下&#xff1a; 1.打开Arduino IDE&#xff0c;依次点击“文件”->“首选项”&#xff0c;在“附加开发板管理器网址”一栏添加ESP8266开发板的网址。常用的网址是&#xff1a; http://arduino.esp8266.com/s…

软件测试——接口常见问题汇总

前言 今天我们来聊聊接口设计用例设计&#xff0c;说到这个接口&#xff0c;相信绝大多数的测试员都有遇到过某些棘手的问题&#xff0c;那么今天我们就来总结一下在接口方面会遇到的难题。 一、接口用例设计 接口测试用例可以从功能、性能、安全三方面进行入手&#xff0c;…

【好书推荐-第十二期】《并行计算与高性能计算》

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公众号&#xff1a;洲与AI。 &#x1f388; 本文专栏&#xff1a;本文收录…

[java基础揉碎]多态参数

多态参数 方法定义的形参类型为父类类型&#xff0c;实参类型允许为子类类型 例子: 定义一个员工类, 有名字和工资两个属性, 有年工资的方法 定义一个普通员工继承了员工类 , 重写了年工资的方法 定义一个经理类, 也继承了员工类, 同时经理多以了一个奖金的属性, 重写的年…

GPD<论文精简版>

问题陈述 给定点云数据、机械手的几何参数&#xff0c;抓取位姿检测问题&#xff08; grasp pose detection problem&#xff09;表示为&#xff0c;在抓手闭合情况下&#xff0c;识别抓手的配置的问题。 &#xff1a;机器人工作空间 &#xff1a;三维点云中的一组点&#x…

宠物疾病 与 光线疗法

人类与动物以及大自然是相辅相成的。人离开动物将无法生存&#xff0c;对于动物我们尽力去保护&#xff0c;与大自然和谐稳定生存发展。 生息在地球上的所有动物、在自然太阳光奇妙的作用下、生长发育。太阳光的能量使它们不断进化、繁衍种族。现在、生物能够生存、全仰仗于太…

windbg调试协议wireshark抓包解析插件

把目录下文件复制到如下位置,Wireshark支持版本4.0以上 C:\Program Files\Wireshark\plugins\4.0\kdnet.lua C:\Program Files\Wireshark\gcrypt.dll C:\Program Files\Wireshark\luagcrypt.dll 启动 “C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe” -k …

如何检测无源晶振过驱?晶振过驱怎么办?

无源晶振(Passive Crystal Oscillator)是一种使用晶体元件来生成稳定频率的振荡器&#xff0c;它不像有源振荡器(如时钟芯片)那样需要外部电源。检测无源晶振是否过驱通常需要通过测量其输出波形和频率&#xff0c;与期望的规格进行比较。 如何检测无源晶振过驱&#xff1a; …

Java高级互联网架构师之路:排查当前JVM错误的步骤

程序 这个程序是有问题的,我们通过一些命令来分析这个程序究竟是哪里出了问题。首先把当前的程序通过SSH工具传输到centos系统中,之后我们就可以在linux环境下编译和执行。 注意一点:上面类的名字是Z,但是在linux环境下,我们将其改为了AA,并且文件名改为了AA,所以文章下…

5 分钟小工具:使用 dive 分析 docker 镜像

需求 拿到一个镜像之后&#xff0c;我想知道&#xff1a; 分层查看镜像里都有哪些文件各层使用了什么命令构建的这个镜像镜像里比较大的文件有哪些&#xff08;可能需要优化&#xff09; dive 工具介绍 dive 工具可以做这些分析。dive 的 github 地址是 wagoodman/dive&…

2024年【电工(初级)】考试资料及电工(初级)实操考试视频

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 电工&#xff08;初级&#xff09;考试资料根据新电工&#xff08;初级&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将电工&#xff08;初级&#xff09;模拟考试试题进行汇编&#xff0c;组成一套电…

HarmonyOS NEXT应用开发—自定义视图实现Tab效果

介绍 本示例介绍使用Text、List等组件&#xff0c;添加点击事件onclick,动画&#xff0c;animationTo实现自定义Tab效果。 效果预览图 使用说明 点击页签进行切换&#xff0c;选中态页签字体放大加粗&#xff0c;颜色由灰变黑&#xff0c;起到强调作用&#xff0c;同时&…

7. 字符串和集合(重点)

常见API API &#xff08;全称 Application Programming Interface&#xff1a;应用程序编程接口&#xff09;就是别人写好的一些程序&#xff0c;给咱们程序员直接拿去调用即可解决问题的。 1 包 1.1 什么是包&#xff1f; 包是用来分门别类的管理各种不同程序的&#xff…

通用大模型研究重点之三:Model APPs

Embedding背景 Embedding 起源于 Word Embedding&#xff0c;经过多年的发展&#xff0c;已取得长足进步。从横向发展来看&#xff0c;由原来单纯的 Word Embedding&#xff0c;发展成现在的Item Embedding、Entity Embedding、Graph Embedding、Position Embedding、Segment …

业务服务:任务调度中心

文章目录 前言一、Scheduled的使用1. 快速使用2. 参数分析 二、xxl-job的使用1. 创建数据库2. 搭建任务调度应用3. 服务注册到xxl-job4. 快速入门5. 任务参数6. 命令行任务7. 跨平台远程调用8. 初始化与销毁9. 邮件报警 前言 任务调度中心&#xff0c;常被用于发送任务&#x…

StarRocks面试题及答案整理,最新面试题

StarRocks 的 MV&#xff08;物化视图&#xff09;机制是如何工作的&#xff1f; StarRocks 的物化视图&#xff08;MV&#xff09;机制通过预先计算和存储数据的聚合结果或者转换结果来提高查询性能。其工作原理如下&#xff1a; 1、数据预处理&#xff1a; 在创建物化视图时…

微信小程序调试、断点调试

1、wxml 查看对应的页面组件 2、console面板可以用来打印信息 3、sources 用来断点调试 4、network面板用来调试接口 5、storage面板 可以查看每个key对应的value内容&#xff0c;这些数据在用户使用小程序时被持久化保存在本地。

【AIGC】重磅消息,GPT-4.5 Turbo将在6月发布?

2024 年 AI 辅助研发趋势 文章目录 强烈推荐GPT-4.5 Turbo竞争对手Anthropic的Claude 3谷歌的Gemini 1.5 Pro 总结强烈推荐专栏集锦写在最后 强烈推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击…

仿牛客项目Day8:社区核心功能2

显示评论 数据库 entity_type代表评论的目标类型&#xff0c;评论帖子和评论评论 entity_id代表评论的目标id&#xff0c;具体是哪个帖子/评论 targer_id代表评论指向哪个人 entity public class Comment {private int id;private int userId;private int entityType;priv…