c语言11天笔记
函数的概述
函数:实现一定功能的,独立的代码模块。我们的函数一定是先定义,后使用。
使用函数的优势:
1. 我们可以通过函数提供功能给别人使用。当然我们也可以使用别人提供的函数,减少代码量。
2. 借助函数可以减少重复性的代码。
3. 实现结构化(模块化)
程序设计思想: 结构化程序设计思想:将大型的任务功能划分为相互独立的小型的任务模块来设计。
函数是C语言程序的基本组成单元:
C语言程序是由一个(必然是main函数)或多个函数组成。
函数的分类
从函数实现的角度:
库函数:C语言标准库实现并提供使用的函数,比如常见的有printf(),scanf()
用户自定义函数:需要程序员自行实现,开发中大部分都是这样的函数
从函数形式的角度:
无参函数:函数调用时,无需传参,可配可不配返回值。
有参函数:函数调用时,需要参数传递数据,经常需要配套返回值使用。
相关概念
主调函数:主动去调用其他函数的函数。
被调函数:被调用的函数
很多时候,一个函数既可以是主调函数,也可以是被调函数。这种情况一般出自自定义函 数。
函数的定义
语法
函数首部:
返回类型:函数返回值的类型
函数名:函数的名称,遵循标识符命名(使用英文字母、数字、_、$,不能以数字开头,建议小写 +下划线命名法)
形参列表:用于接收主调函数传递的数据,如果有多个用" , "分隔,且每一个形参都需要指定类 型。
面试题:
注意:
函数类型标识符变量类型说明符相同,它表示返回的函数值的类型。
在C语言中还可以定义无类型(即void类型)的函数,这种函数不返回函数值,只是完成某种功 能。
如果省略函数的类型标识符,则默认为是int型。
函数中返回语句的形式为 return(表达式);或 return 表达式;其作用是将表达式的值作为函数值返 回给调用函数。其中表达式的类型应与函数类型一致。
如果"形参表列"中有多个形式参数,则它们之间要用" , "分隔。
如果形参表中有多个形参,即使它们的类型是相同的,在形参表中也只能逐个进行说明。 fun1(in t a,int b){}
一个完整C程序中的所有函数可以放在一个文件中,也可以放在 多个文件中。
案例
案例1:
案例2:
形参和实参
概念
形参(形式参数):
函数定义时指定的参数,形参是用来接收数据的,函数定义时,系统不会为形参申请内存,只有当函 数调用时,系统才会为形参申请内存,用于存储实际参数,并且当函数返回,系统会自动回收为形参 申请的内存资源。(本质上所有函数都有return,只不过当我们的函数返回类型是void的时候,return 关键字被省略了)
实参(实际参数):
函数调用时主调函数传递的数据参数(常量、变量、表达式..,只要有确定的值),实参是传递的 数据。
实参和形参必须类型相同。若不同时,按赋值规定自动进行类型转换。
在C语言中,参数传递遵循 单向值传递 ,实参只是将自身的值传递给形参,而不是实参本身。形参 的值的改变不会影响实参。
实参与形参在内存中占据不同的内存空间,尽管可能实参和形参名称是一样的。
案例2:
函数的返回值
若不需要返回值,函数中可以没有return语句。
一个函数中可以有多个return语句,但任一时刻只有一个return语句被执行。
被调函数返回给主调函数的结果数据(可以是变量、常量、表达式,只要是有确定值即可。)
返回值类型一般情况下需要和函数中return语句返回的数据类型保持一致,如果不一致,以函数定 义时指定的返回类型为标准。也就是返回值类型和实际返回值可以存在自动类型转换或者强制类型 转换的关系。
案例1:
案例2:
案例3:
函数的调用
调用方式
1. 函数语句: test(); int result = max(2,4);
2. 函数表达式: 4 + max(2,4);
3. 函数参数: printf("%d",max(2,4))
在一个函数中调用另一个函数须具备以下条件
① 被调用的函数必须是已经定义的函数;
② 若使用库函数,应在本文件开头用#include包含;
③ 若使用用户定义的函数,而用户函数又在主调函数的后面,则应在主调函数中对被调用的函数进 行声明。声明的作用是把函数名、函数参数的个数和类型等信息通知编译系统,以便在遇到函数时, 编译系统能正确识别函数,并检查函数调用的合法性。
函数声明
函数调用时,往往要遵循 先定义后调用 ,但如果我们对函数的调用操作出现在函数的定义之前,则需 要对函数进行声明。
函数声明的作用:
是把函数名、函数参数的个数和返回类型等信息通知给编译系统,以便于在遇到函数时,编译系统能 正确识别函数,并检查函数调用的合法性。
声明的方式:
函数首部后加上分号
函数首部后加上分号,可省略形参名,但不能省略参数类型。
函数的嵌套调用
函数不允许嵌套定义,但允许嵌套调用。
嵌套调用:在被调函数内有去主动去调用其他函数,这样的函数调用方式,称之为嵌套调用;
案例1:
案例2:
函数的递归调用
递归调用的含义:在一个函数中,直接或者间接调用了函数本身称之为函数的递归调用。
递归调用的本质:
是一种循环结构,它不同于之前所学的while,do-while,for这样的循环结构,这些循环结构是借 助循环变量,而递归是利用函数自身实现循环结构,如果不加以控制,很容易产生死循环。
递归调用的注意事项:
1. 递归调用必须要有出口,一定要终止递归(否则会产生死循环)。
2. 对终止条件的判断一定要放在函数递归之前。
3. 进行函数的递归调用。
4. 函数递归的同时一定要将函数调用向出口逼近。
案例1
案例2:
数组做函数参数
注意:
当用数组做函数的实际参数时,则形参应该也要用数组/指针变量来接收,但请注意,此次并不 代表传递了数组中所有的元素数据,而是传递了第一个元素的内存地址(数组首地址),形参接收这 个地址后,则形参和实参就代表了同一块内存空间,则形参的数据修改会改变实参的。这种数据传递 方式我们可以称之为“引用传递”。
如果用数组做函数形式参数,那么我们提供另一个形参表示数组的元素个数。原因是数组形参代 表的仅仅是实际数组的首地址。也就是说形参只获取到了实际数组元素的开始,并未获取元素的结 束。所以提供另一个形参表示数组的元素个数,可以防止在被调函数对实际数组元素访问的越界。
但有一个例外,如果是用字符数组做形参,且实际数组中存放的是字符串数据(形参是字符数 组,实参是字符串)。则不用表示数组元素的个数的形参,原因是字符串本身会自动结束符\0。
案例-数组元素做函数实参:
案例2:
变量的作用域
引入问题
我们在函数设计过程中,经常要考虑对参数的设计,换句话说,我们需要考虑函数需要几个参数,需 要什么类型的参数,但我并没有考虑函数是否需要提供参数,如果说函数可以访问到已定义的数据, 则就不需要提供函数形参,那么我么到底要不要提供函数参数,取决于什么?答案就是变量的作用域 (如果函数在变量的作用域范围内,则函数可以直接访问数据)
变量的作用域
概念:变量的作用范围,也就是说变量在什么范围是有效的。
变量的分类
根据变量的作用域不同,变量可分为全局变量和局部变量
局部变量
全局变量
建议在全局变量定义时初始化。如果不初始化,系统会将全局变量初始化为0(0 | \0 |0.0)。
使用全局变量的优缺点:
优点:
1. 利用全局变量可以实现一个函数对外输出的多个结果数据。
2. 利用全局变量可以减少函数形参个数,从而降低内存消耗,以及因形参传递带来的时间消耗。
缺点:
1. 全局变量在程序的整个运行期间,始终占据内存空间,会引起资源消耗。
2. 过多的全局变量会引起程序的混乱,造成程序结果错误。
3. 降低程序通用性,特别是当我们进行函数移植时,不仅仅要移植函数,还要考虑全局变量。
4. 违反了“高内聚,低耦合”的程序设计原则。
总结:我们发现弊大于利,建议尽量减少对全局变量的使用,函数之间要产生联系,仅通过实参形参的方式产生联系。
作用域举例:
案例:
注意:
如果全局变量(外部变量)和局部变量同名,程序执行的时候, 就近原则
变量的生命周期
概念:
变量在程序运行中的存在时间。 根据变量存在的时间不同,变量可分为静态存储方式和动态存储方式。
变量的存储类型
存储类型
auto
auto存储类型只能修饰局部变量,被auto修饰的局部变量是存储在动态存储区的。auto也是局部变 量默认的存储类型。
static
修饰局部变量:局部变量会被存储在静态存储区。局部变量的生命周期被延长,但是作用域不发 生改变。
修改全局变量:全局变量的生命周期不变,但作用域被衰减。一般限制全局变量只能在本文件 内。
demo01.c
demo02.c
extern
外部存储类型:只能修饰全局变量,次全局变量可以被其他文件访问。相当于扩展了全局变量的 作用域。
extern修饰外部变量,往往是外部变量进行声明,声明该变量是在外部文件中定义的;不是变量定 义。
demo01.c
demo02.c
register
寄存器存储类型:只能修饰局部变量,用register修饰的局部变量会直接存储到CPU的寄存器中, 往往将循环变量设
置为寄存器存储类型。
面试题
static关键字的作用
1. static修饰局部变量,延长其生命周期,但不影响局部变量的作用域。
2. static修饰全局变量,不影响全局变量的生命周期,会限制全局变量的作用域仅限本文件内使用;
3. static修饰函数:此函数就称为内部函数,仅限本文件内调用。 static int funa(){..}
值传递与引用传递
值传递:发生在整型、浮点型、字符型,数据传递,传递的是数值,也就是内存空间只能被当前变 量独享。
引用传递:发生在数组、指针、结构体..,数据传递,传递的是地址值,也就是内存空间可以被多 个变量共享。
内部函数和外部函数
内部函数:使用static修饰的函数,称作内部函数,内部函数只能在当前文件中调用。
外部函数:使用extern修饰的函数,称作外部函数,extern是默认的,可以不写,也就是说本质上 我们所写的函数都是外部函数,建议外部函数在被其他文件调用的时候,在其他文件中声明的时 候,加上extern关键字。
章节作业
编程题
1. 编写一个函数,通过输入球的半径,返回球的体积;
2. 编写一个函数,通过输入一个数字字符,返回该数字
3. 编写一个函数,输入四个数据分别表示2个点的x,y坐标,返回两点之间的距离;
4. 编写一个函数,通过参数输入一个整型数,返回该数各位上数字的平方和;
5. 编写一个函数,通过参数输入x的值,计算如下的数学函数值,当 x>5时, f(x) = 4x+7;否则 f(x) = -2x+3,返回结果值
6. 设计一个函数,用来求出多个数据的平均值;
7. 设计一个函数,用来查找一个字符串中某个字符的位置;
8. 设计一个函数,把一个整型数字转成对应的字符串格式
9. 设计一个函数,统计字符串中大写字母的个数
10. 设计函数,实现strcmp 的功能;
11. 编写函数,用于判断输入的字符是不是个数字。是返回1,不是返回0.
12. 设计一程序,实现一个简单的计算器。 要求:有菜单函数 和加、减、乘、除的函数 主函数调用这些函数实现程序的功能.要求菜单函数能 够输出如下的界面
1、加法 2、减法 3、乘法 4、除法 0.退出
13. 设计函数实现冒泡排序;
思考题【选做】
14. 编写一个函数,将数组中的数据首尾互换
相关文章:

c语言11天笔记
函数的概述 函数:实现一定功能的,独立的代码模块。我们的函数一定是先定义,后使用。 使用函数的优势: 1. 我们可以通过函数提供功能给别人使用。当然我们也可以使用别人提供的函数,减少代码量。 2. 借助函数可以减…...

【C++刷题】优选算法——贪心第三辑
坏了的计算器 int brokenCalc(int startValue, int target) {int step 0;while (target > startValue) {if (target % 2 0) target / 2;else target 1;step;}return step startValue - target; }合并区间 区间问题,先排序 vector<vector<int>>…...

9.2 grafana 上导入模板看图并讲解告警
本节重点介绍 : 添加到prometheus采集配置中grafana 上导入process-exporter dashboard重点指标讲解 添加到prometheus采集配置中 - job_name: process-exporterhonor_timestamps: truescrape_interval: 15sscrape_timeout: 10smetrics_path: /metricsscheme: httpstatic_con…...
python实现自动回复消息
本文使用创作助手。 下面是一个使用uiautomation库实现自动回复QQ消息的示例代码: import time import uiautomation as autodef auto_reply():# 打开QQauto.uiautomationhelper.ShellExecute(r"C:\Program Files (x86)\Tencent\QQ\Bin\QQScLauncher.exe&quo…...

Mysql 脚本转换为drawio ER 脚本
Navicat 导出数据库脚本 通过代码转换脚本 import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern;/*** SQL 脚本转换为 drawio ER 脚本*/ pu…...

基于babylonjs的小游戏 跳一跳
源码地址...

移动端下拉加载更多(h5,小程序)
1.h5,使用原生方式监听页面滚动下拉加载更多 <template><div></div> </template><script> export default {data() {return {loadflag: true,maxpages: 0, //最大页码currentpage: 0, //当前页listData: [],config: {page: 1,pageSize: 15,tota…...
Linux安全与高级应用(二)Linux Web服务器的安全配置与高级应用
文章目录 Linux Web服务器的安全配置与高级应用一、HTTPD服务的基本配置1.1 HTTPD服务简介1.2 HTTPD配置文件 二、Web服务的访问控制2.1 客户端地址限制2.2 用户授权限制 三、构建虚拟Web主机3.1 虚拟主机简介3.2 基于域名的虚拟主机3.3 基于IP地址的虚拟主机3.4 基于端口的虚拟…...
关于React.createContext全局注入的一些记录
一、React Context 原理 简单地说就是可以将一些数据注入到Context对象中,使其下辖的组件可以随时随地访问这些数据,省去了逐层传递的步骤。 相对于在组件里挖槽(比如{props.children}),使用Context应该更注重随时随…...

在S/4HANA OP 1511中激活嵌入式分析的基本配置
大家好,在这篇博客中,我将讨论在 S/4HANA On-Premise 1511 版本中激活嵌入式分析的基本配置。本博客主要关注Fiori前端系统和S/4HANA后端系统的分离安装。让我们深入了解一下。 景观 前端系统 SAP Fiori for S/4HANA OP 1511 Bakend系统SAP S/4HANA后…...
好的提交 VS. 坏的提交 :Git 的最佳实践
在软件或网页开发的精彩世界中,版本控制是每个与其他开发者合作项目的开发者必备的工具。Git 是最常用的版本控制系统之一,它帮助开发者跟踪变更、有效地回到之前的状态,并在项目中进行团队协作。但是,Git 的工作只有在正确管理提…...

MySQL第4讲--图像化界面工具DataGrip介绍
文章目录 前言DataGrip的下载DataGrip安装DataGrip连接数据库DataGrip使用创建数据库创建表修改表 DataGrip中编写SQL语句操作数据库 前言 在第二讲MySQL第2讲–关系型数据库以及SQL语句分类之DDL数据库和表的操作和第三讲MySQL第3讲–数据类型和表的修改和删除的介绍当中所有的…...
Curl工具小记
curl 是一个非常强大且灵活的命令行工具,用于获取或发送数据,无需用户图形界面交互。它支持多种协议,并且可以在脚本中使用,以实现自动化任务。 基本介绍 curl 是 “Client URL” 的缩写,它是一个利用 URL 语法在命令…...

【C#语音文字互转】C#语音转文字(方法一)
Whisper.NET开源项目:https://github.com/sandrohanea/whisper.net/tree/main 一. 环境准备 在VS中安装 Whisper.net,在NuGet包管理器控制台中运行以下命令: Install-Package Whisper.net Install-Package Whisper.net.Runtime其中运行时包…...
基于Linux系统下的在线手机商城
项目背景 随着网络的发展,电子商务的兴起和普及使得消费者越来越倾向于通过互联网购买商品和服务,越来越多的传统零售商和新兴企业转向在线销售以满足消费者的需求,个成功的在线商城项目背景包括对市场需求、竞争环境、技术和平台选择、商业…...
Apache Kafka 事务详解
Apache Kafka 事务详解 Apache Kafka 是一个分布式流处理平台,主要用于实时数据的传输和处理。在现代的数据密集型应用中,事务性保证在数据传输和处理中的作用至关重要。本文将详细介绍 Kafka 的事务性支持,包括其基本概念、架构、使用方法以…...
Go语言 结构体
本文主要为Go语言 结构体介绍、语法、使用注意及其示例。 目录 结构体 语法 语法示例 语法说明 声明使用 创建并赋值 使用指针 使用注意 总结 结构体 C语言里面,我们可以使用typedef in MyInt。 在go语言中使用结构体来模拟类,使用type stru…...

数据结构(邓俊辉)学习笔记】词典 03—— 排解冲突(1)
文章目录 1. 一山二虎2. 泾渭分明3. 开放定址4. 线性试探5. 赖惰删除 1. 一山二虎 此前我们已经多次指出,对于需要动态维护的散列表冲突是不可避免的,无论你的散列函数设计的有多么精妙,因此我们不得不回答的第二个重要问题就是一旦发生冲突&…...
HTML5+CSS3-HTML5入门
1.web标准 W3C为web标准化做出了以下事项,主要包括结构,表现和行为。 结构用于对网页的信息进行分类和整理,使用技术包括HTML,XML,XHTML 表现指网页的外在样式,一般包括网页的版式,颜色,字体,…...

谷粒商城实战笔记-138-商城业务-首页-渲染二级三级分类数据
本节的主要内容是在前一节的基础上,提供结构查询出所有的二级、三级分类数据。 一,构造响应体数据结构 后端返回给前端的数据结构是在开发详细设计中应该确定的内容。 分析前端需要的数据结构,后端要将所有一级分类包含的二级和三级分类信…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...