函数(详解)——C语言

news2024/12/24 8:26:49

       Hello,友友们前段时间忙拖更了这么久,趁着五一假期好好卷上一波哈哈哈。好的,我们本期主要对C语言中的函数进行讲解。

1.什么是函数

在数学中也常常用到函数,但你对C语言中的函数有了解吗?

在C语言中函数是一段可重复调用的代码块,能够完成待定的任务并返回一个值。函数是C语言中最基本的代码组织单位之一,可以将一段代码的功能模块化,同时也具有很高的可重用性和可扩展性。

在C语言中可将函数分为两大类:

1)库函数

2)自定义函数

库函数:

       库函数是C语言中一组预定义的,可重用的函数,用于执行特定的任务和操作。这些函数通常包含在标准C语言库中,也可以包含在其他库中,如数学库,输入输出库等。在编写代码时可以直接使用这些函数,方便程序员进行软件开发。调用这些库函数可以极大的简化我们的代码。      (直白点就是C语言中封装的有现成可使用的函数,在编写代码时可以直接使用,但必须要包含所在的头文件)

那么我们要如何学习并使用这些库函数呢?

这里博主给大家推荐一个网站:www.cplusplus.com

这是一个标准的C语言在线参考网站,它提供了大量的C语言相关的教程,代码示例等资源。我们学习并使用库函数也可在上边查得到。

 我们在C语言中常用的库函数可分为以下几种:

1. IO函数(输入,输出函数)

2. 字符串操作函数

3. 字符操作函数

4. 内存操作函数

5. 时间/日期函数

6. 数学函数

7. 其他函数

这几种函数大家可以在网站上着重学习了解以下。

注:使用库函数,必须要包含#include对应的头文件

自定义函数

      现实中,我们会遇到许多情况是单单库函数的功能是无法解决的,这时就需要我们自定义函数去解决它。

在函数的学习过程中,自定义函数更为重要

自定义函数和库函数一样,有函数名,返回值类型,和函数参数。但自定义函数不同的是,这些都可以由程序员自己设定。

函数的组成

 函数的使用

我们举个栗子:

#include<stdio.h>
int max(int x, int y)
{
	return (x > y) ? x : y;
}
int main()
{
	int a, b,t;
	printf("请输入两个整数>\n");
	scanf("%d%d", &a, &b);
	t = max(a, b);
	printf("%d\n", t);
	return 0;
}

通过函数来实现比较两个数的大小;

函数的参数

在C语言中函数的参数分为两种:

1)形式参数(简称形参)

2)实际参数(简称实参)

形参

      形参是指函数名后括号内的变量,形式参数的作用是定义函数的输入和输出,它在函数体中充当变量的角色,它的类型,个数决定了函数输入输出的内容。因为形式参数只有在被函数调用过程中才实例化(分配内存单元),所以叫做形式参数。形参当函数调用完成之后就会自动销毁,因此形参只在函数中有效。

实参

实参是在函数调用时传给函数的实际参数,函数调用时会将实参传递给形参。当然实参的类型和个数都必须与形参的类型和个数相匹配。

在上述的代码中,a,b就是实参,x和y就是形参。

函数的调用

函数调用也是分为两种:

1)传值调用

2)传址调用

传值调用

将实参的值复制一份传递给形参,函数内部对形参的修改不会影响实参

传址调用

将实际参数的内存地址传递给函数的形式参数,函数内部对形参进行修改会改变实际参数的值。

那么我们如何判断是使用传值调用还是传址调用呢?

想要改变实参的值时适合使用传址调用,仅仅只是筛选实参里的数据等功能,不对实参进行修改,就更适合使用传值调用。

我们用代码来演示:

#include<stdio.h>
void Swap1(int n1,int n2) {
	int t;
	t = n1;
	n1 = n2;
	n2 = t;
}
void Swap2(int* px, int* py) {
	int t;
	t = *px;
	*px = *py;
	*py = t;
}
int main() {
	int x1=1, x2=2;
	printf("交换前: %d %d\n", x1, x2);
	Swap1(x1,x2);
	printf("交换后: %d %d\n",x1,x2);
	Swap2(&x1, &x2);
	printf("交换后: %d %d\n",x1,x2);
	return 0;
}

 运行结果如下:

 传值

 传址

 

 如上图:我们可以清晰的看到,两种调用方式造成形参的值不同。

形参传值操作时相当于将实参复制了一份并开辟了一块新的空间,对形参操作并不会影响实参。

而传址是将实参地址传递给形参,通过地址找到实参里的数据,并对实参进行修改。

函数的嵌套调用和链式访问

函数和函数之间可以有机的组合。最终来实现一个完整的功能。

嵌套调用

void print1()
{
	printf("haha\n");
}
void three()
{
	for (int i = 0; i < 3; i++) {
		print1();
	}
}
int main() {
	three();
	return 0;
}

例如这段代码,函数之间是可以嵌套使用的。

但要注意:函数可以嵌套调用,但不可以嵌套定义

链式访问

把一个函数的返回值当作另一个函数的参数。

int main() {
    char arr[20] = "hello";
	int ret = strlen(strcat(arr, "world"));//strcat作用是将两个字符串连接
	printf("%d\n", ret);//输出结果为10
	return 0;
}

strcat返回值是helloworld,其返回值又再次作为参数传给strlen。

函数声明和定义

函数声明:

1.告诉编译器有一个函数,参数是什么,返回类型是什么,但是不是存在无关紧要。

2.函数的声明一般出现在函数的使用之前,要满足先声明后使用。

3.函数声明一般要放在头文件中。

int ADD(int x, int y);
int main()
{
	int a = 2;
	int b = 3;
	printf("%d", ADD(a, b));
	return 0;
}
int ADD(int a, int b)
{
	return (a + b);
}

 如上代码,先对函数进行声明,才可以调用,注意:函数声明必须要在函数调用之前,函数定义位置可随意(在较短的程序中,可将函数定义放在主函数前代替声明)。

函数定义:

函数定义是指函数的具体实现,交代函数的功能实现。

在正常情况中,我们一般会把函数声明放在头文件中以 .h结尾的文件,.c文件放置函数实现。这样可以简化代码结构,同样也会便于在程序编写中分模块多人共同维护。

主文件(.c文件):

#include"test.h"
int main()
{
	int a = 2;
	int b = 3;
	printf("%d", ADD(a, b));
	return 0;
}

函数实现文件(.c文件):

int ADD(int a, int b)
{
	return (a + b);
}

头文件(.h文件):

#include<stdio.h>
int ADD(int x, int y);

具体创建位置如下:

 在.h文件中声明函数,包含头文件在主函数文件中只需调用我们自己创建的.h文件即可。在同一源文件下就可以不用引用头文件。

  好了本期内容到此就结束啦!

 希望可以对你有些帮助。后续我将持续更新练习及讲解巩固这些知识哦,好的感谢阅读!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构学习分享之单链表详解

数据结构第三课 1. 前言2. 链表的概念以及结构3. 链表的分类4.链表的实现4.1 初始化结构4.2 尾插函数4.3 尾删函数4.4 头插函数4.5 头删函数4.6 开辟新节点4.7 销毁链表 5. 单链表OJ题目6. 顺序表和链表的区别7. 总结 1. 前言 &#x1f493;博主CSDN:杭电码农-NEO&#x1f493;…

五年开发经验前端程序员,刚入职一个月就要离职,我来聊聊看法

最近有一个新来的同事&#xff0c;估计又要离职了吧。从他的工作经历来看&#xff0c;大概有5年的前端工作经验&#xff0c;但是头发看起来挺少的&#xff0c;不知道是工作加班导致的&#xff0c;看他的性格不太像是经常加班的。 他这个人就是我们公司人事面试的&#xff0c;虽…

操作系统——进程管理

0.关注博主有更多知识 操作系统入门知识合集 目录 0.关注博主有更多知识 4.1进程概念 4.1.1进程基本概念 思考题&#xff1a; 4.1.2进程状态 思考题&#xff1a; 4.1.3进程控制块PCB 4.2进程控制 思考题&#xff1a; 4.3线程 思考题&#xff1a; 4.4临界资源与临…

躺平减脂减重法补充篇——无需控制碳水摄入的有效方法,另推一种健康的运动和防止老年慢性病的方式...

本文此前已经连续发表了六篇相关文章&#xff0c;内容确实比较多&#xff0c;最近又做了一组实验&#xff0c;进食了大量的锅巴&#xff0c;看看是否会带来体重的增加&#xff0c;每天进食量都不少于200克锅巴&#xff0c;对&#xff0c;4两重&#xff0c;而且是在每天正常进食…

SAPUI5 之XML Views (视图) 笔记

文章目录 官网 Walkthrough学习-XML Views视图案例要求&#xff1a;我们把上面通过index.html body的展示放在XML中展示1.0.1 新增view文件夹1.0.2 在xml文件中新增一个Text 文本1.0.3 在index.js中实例化view视图1.0.4 执行刷新浏览器1.0.5 调试界面分析结果 官网 Walkthrough…

假期给朋友介绍如何学习java和找工作的建议?

Java学习 一、学习Java的建议1. 学习Java基础知识2. 学习Java框架3. 学习Java Web开发4. 学习Java数据库编程5. 学习Java工具6.学习Java中的多线程技术6. 练习编程 二、找工作的建议1. 准备好简历2. 寻找工作机会3. 准备面试4. 提高自己的技能5. 关注行业动态 学习Java和找工作…

第十九章 观察者模式

文章目录 前言普通方式解决问题CurrentConditions 显示当前天气情况WeatherData 管理第三方Clint 测试 一、观察者模式(Observer)原理完整代码SubjectObserverWeatherData implements SubjectCurrentConditions implements ObserverBaiduSite implements ObserverClint 前言 普…

《软件工程教程》(第2版) 主编:吴迪 马宏茹 丁万宁 第十章课后习题参考答案

第十章 面向对象设计 课后习题参考答案 一、单项选择题 &#xff08;1&#xff09;A &#xff08;2&#xff09;B &#xff08;3&#xff09;B &#xff08;4&#xff09;D &#xff08;5&#xff09;A &#xff08;6&#xff09;C&#xff08;7&#xff09;D &#xff0…

【学习心得】Python多版本控制

问题描述&#xff1a;本文主要解决Windows系统下的多个Python版本共存问题。 &#xff08;一&#xff09;安装不同版本Python 官方下载链接&#xff1a;Python Releases for Windows | Python.org 下载如图中所示的版本&#xff08;64位Windows系统可执行安装包版本&#xff0…

赞!数字中国建设峰会上的金仓风采

4月30日&#xff0c;第六届数字中国建设成果展览会圆满落幕。人大金仓深度参与本届峰会&#xff0c;在会上发布产品新版本&#xff0c;展出国产数据库前沿的行业解决方案和创新应用成果&#xff0c;出席国资央企SaaS应用服务共享平台伙伴签约仪式&#xff0c;吸引众多用户、伙伴…

面试官:你知道 Spring lazy-init 懒加载的原理吗?

普通的bean的初始化是在容器启动初始化阶段执行的&#xff0c;而被lazy-init修饰的bean 则是在从容器里第一次进行context.getBean(“”)时进行触发。 Spring 启动的时候会把所有bean信息(包括XML和注解)解析转化成Spring能够识别的BeanDefinition并存到Hashmap里供下面的初始…

k210单片机定时器的应用

定时器应该是一个单片机的标准配置&#xff0c;所以k210也是有的&#xff0c;拥有3个定时器&#xff0c;具体的使用方法我们往下看&#xff1a; 分步介绍&#xff1a; 首先是相关模块的使用 构造函数&#xff1a; machine.Timer(id,channel,modeTimer.MODE_ONE_SHOT,period100…

【7. ROS 中的 IMU 惯性测量单元消息包】

欢迎大家阅读2345VOR的博客【6. 激光雷达接入ROS】&#x1f973;&#x1f973;&#x1f973; 2345VOR鹏鹏主页&#xff1a; 已获得CSDN《嵌入式领域优质创作者》称号&#x1f47b;&#x1f47b;&#x1f47b;&#xff0c;座右铭&#xff1a;脚踏实地&#xff0c;仰望星空&#…

vue3回到上一个路由页面

学习链接 Vue Router获取当前页面由哪个路由跳转 在Vue3的setup中如何使用this beforeRouteEnter 在这个路由方法中不能访问到组件实例this&#xff0c;但是可以使用next里面的vm访问到组件实例&#xff0c;并通过vm.$data获取组件实例上的data数据getCurrentInstance 是vue3提…

Java --- springboot2请求参数处理

目录 一、请求参数处理 1.1、请求映射 1.2、自定义请求规则 1.3、请求处理 1.4、普通参数与基本注解 1.4.1、注解 1.5、参数处理原则 1.6、复杂参数 1.7、自定义参数对象 1.8、自定义Converter 一、请求参数处理 1.1、请求映射 // RequestMapping(value "…

c#笔记-下载编辑器

IDE IDE是指集成开发环境&#xff08;Integrated Development Environment&#xff09;&#xff0c;是一种将软件开发所需的软件组合在一起&#xff0c;可以从同一操作界面以统一的操作方式使用的软件包。通常包括代码编辑器、编译器、链接器、调试器、测试工具、版本管理软件等…

自动化运维工具一Ansible Playbook语法实战

目录 一、Ansible Playbook剧本初识 1.1 Ansible Playbook 基本概述 1.1.1 什么是playbook 1.1.2 Ansible playbook 与AD-Hoc的关系 1.2 Ansible Playbook 书写格式 1.2.1安装NFS 服务 1.3 Playbook变量详解 1.3.1 使用 vars定义变量 1.3.2 使用 vars_flies定义变量 …

Java每日一练(20230501)

目录 1. 路径交叉 &#x1f31f;&#x1f31f; 2. 环形链表 &#x1f31f;&#x1f31f; 3. 被围绕的区域 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏…

17自由度人形机器人实现行走功能

1. 功能说明 本文示例将实现R307样机17自由度人形机器人行走的功能。该项目利用探索者平台制作&#xff0c;其驱动系统采用伺服电机。 2. 仿人形机器人结构设计 人型机器人是一种旨在模仿人类外观和行为的机器人&#xff08;robot&#xff09;&#xff0c;尤其特指具有和人类相…

VS快捷键大全 | 掌握这些快捷键,助你调试快人一步

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…