【C语言回顾】函数

news/2024/5/17 9:48:07

  • 前言
  • 1. 函数的概念和分类
  • 2.库函数
  • 3. 自定义函数
    • 3.1 自定义函数的简单介绍
    • 3.2 自定义函数举例
  • 4. 形参和实参
    • 4.1 形参
    • 4.2 实参
    • 4.3 形参和实参的关系
      • 4.3.1 理解
      • 4.3.2 举例代码和调试
  • 5. 嵌套函数和链式访问
    • 5.1 嵌套函数
    • 5.2 链式访问
  • 6. 函数的声明和定义
    • 6.1 单个文件
    • 6.2 多个文件
    • 6.3 static 和 extern
      • 6.3.1 static
      • 6.3.2 extern
      • 6.3.1 两者区别
  • 结语


在这里插入图片描述


上期回顾: 【C语言回顾】数组
个人主页:C_GUIQU
专栏:【C语言学习】

在这里插入图片描述

前言

各位小伙伴大家好!上期小编给大家讲解了C语言中的数组,接下来讲讲C语言中的函数!
在这里插入图片描述

1. 函数的概念和分类

【概念】本质上就是子程序。
在这里插入图片描述
【分类】
库函数:C语言内部提供的函数。
自定义函数:自己写出的函数。

2.库函数

【概念】库函数(Library function)是将函数封装入库,供用户使用的一种方式。

【常见库函数】

  • IO函数
  • 字符串操作函数
  • 内存操作函数
  • 时间/日期函数
  • 数学函数

【简单示例】

#include <stdio.h>
#include <math.h> int main() 
{ double d = 16.0; double r = sqrt(d); printf("%lf\n", r); return 0; 
} 

在这里插入图片描述

3. 自定义函数

3.1 自定义函数的简单介绍

自定义函数就是自己定义的函数,功能可以多种多样!

ret_type fun_name(形式参数)
{}

• ret_type 是函数返回类型
• fun_name 是函数名
• 括号中放的是形式参数
• {}括起来的是函数体

在这里插入图片描述
可以把函数想象成⼩型的⼀个加⼯⼚,⼯⼚得输⼊原材料,经过⼯⼚加⼯才能⽣产出产品,那函数也是⼀样的,函数⼀般会输⼊⼀些值(可以是0个,也可以是多个),经过函数内的计算,得出结果。

3.2 自定义函数举例

写⼀个加法函数,完成2个整型变量的加法操作

#include <stdio.h> 
int Add(int x, int y) 
{ int z = 0; z = x+y; return z; 
} 
int main() 
{ int a = 0; int b = 0; //输⼊ scanf("%d %d", &a, &b); //调⽤加法函数,完成a和b的相加 //求和的结果放在r中 int r = Add(a, b); //输出 printf("%d\n", r); return 0; 
} 

4. 形参和实参

4.1 形参

【概念】写在自定义函数内部的参数。

【形参的实例化】形式参数只有在函数被调⽤的过程中为了存放实参传递过来的值,才向内存申请空间。

4.2 实参

【概念】真实传递给函数的参数。

4.3 形参和实参的关系

4.3.1 理解

  • 形参和实参各⾃是独⽴的内存空间。
  • 形参是实参的⼀份临时拷⻉。

4.3.2 举例代码和调试

#include <stdio.h> 
int Add(int x, int y) 
{ int z = 0; z = x + y; return z; 
} 
int main() 
{ int a = 0; int b = 0; //输⼊ scanf("%d %d", &a, &b); //调⽤加法函数,完成a和b的相加 //求和的结果放在r中 int r = Add(a, b); //输出 printf("%d\n", r); return 0; 
} 

在这里插入图片描述

5. 嵌套函数和链式访问

5.1 嵌套函数

【说明】在函数中调用函数,就是嵌套函数。函数可以嵌套,但是函数不可以嵌套定义。

#include <stdio.h>void test(int arr[],sz); //函数的声明
void print(int arr[],int sz);int main()
{int arr[10] = {0};int sz = sizeof(arr)/sizeof(arr[0]);test(arr,sz);    //函数的调用——打印数组各元素return 0
}void test(int arr[],sz)        //函数的调用
{int i =0;for(i=0;i<sz;i++){arr[i]=i;        //数组元素赋值}print(arr,sz);        
}void print(int arr[],int sz)
{for(i=0;i<sz;i++){printf("%d ",arr[i]);        //打印数组元素}
}

5.2 链式访问

【说明】将⼀个函数的返回值作为另外⼀个函数的参数,像链条⼀样将函数串起来。

【示例】

#include <stdio.h>
int main()
{printf("%d\n", strlen("abcdef"));//链式访问return 0;
}    

6. 函数的声明和定义

6.1 单个文件

【单个文件举例】

//判断⼀年是不是闰年 #include <stido.h> int is_leap_year(int y)
{if(((y%4==0)&&(y%100!=0)) || (y%400==0))return 1;elsereturn 0;
}
int main()
{int y = 0;scanf("%d",&y);int r = is_leap_year(y);if(r == 1)printf("闰年\n");elseprintf("⾮闰年\n");return 0;
}

6.2 多个文件

我们写代码时候,代码可能⽐较多,不会将所有的代码都放在⼀个⽂件中;我们往往会根据程序的功能,将代码拆分放在多个⽂件中。
⼀般情况下,函数的声明、类型的声明放在头⽂件(.h)中,函数的实现是放在源⽂件(.c)⽂件中。
【示例】

//add.c
//函数的定义 
int Add(int x, int y) 
{ 
return x+y; 
} 
//add.h
//函数的声明 
int Add(int x, int y); 
//test.c#include <stdio.h> 
#include "add.h" int main() 
{ 
int a = 10; int b = 20; //函数调⽤ int c = Add(a, b); printf("%d\n", c); return 0; 
} 

6.3 static 和 extern

static 和extern 都是C语言中的关键字。
【拓展】
作用域:是程序设计概念,通常来说,⼀段程序代码中所用到的名字并不总是有效的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
生命周期:指的是从变量的创建(申请内存)到变量的销毁(收回内存)之间的⼀个时间段。

  • 局部变量的作用域是变量所在的局部范围。
  • 全局变量的作用域是整个工程(项目)。
  • 局部变量的生命周期是:进入作用域变量创建,生命周期开始,出作用域生命周期结束。
  • 全局变量的生命周期是:整个程序的生命周期。

6.3.1 static

static 是静态的的意思。

【用法】

  • 修饰局部变量
  • 修饰全局变量
  • 修饰函数

6.3.2 extern

extern ⽤来声明外部符号。

【用法】

  • extern的作用范围是整个工程,是共享性的。
  • 置于变量或者函数前,以标示变量或者函数的定义在别的文件中(也可能是本文件),可以有多个声明,但只能有一个定义。
  • 与"C"连用,如extern “C” void fun();告诉编译器按C的规则去翻译。
  • extern就是专门用来声明全局变量的,函数内定义的对象不能被extern声明。

6.3.1 两者区别

  • static修饰的全局是内部链接性,内部链接性在编译单元间不共享;而extern是整个工程全局共享的。

  • static修饰全局变量时,声明和定义是同时给出的;extern则是在一处定义,其他地方都是声明。

  • 它们不能同时修饰一个变量。

结语

以上就是小编对函数的讲解。
如果觉得小编讲的还可以,还请一键三连。互三必回!
持续更新中~!
在这里插入图片描述


http://www.mrgr.cn/p/20205724

相关文章

无法用raven-js,如何直接使用TraceKit标准化错误字符串(一次有趣的探索)

引子&#xff1a;网上三年前&#xff08;2020&#xff09;的文章介绍了一个raven-js 简单说就是把堆栈信息格式化兼容各浏览器&#xff0c;便于查看错误来源。 **but&#xff1a;**到处找了一下raven-js&#xff0c;已经没有官方出处了&#xff0c;只在Sentry的源码仓库里发现…

【系统分析师】计算机网络

文章目录 1、TCP/IP协议族1.1 DHCP协议1.2 DNS协议1.3网络故障诊断 2、网路规划与设计2.1逻辑网络设计2.2物理网络设计2.3 分层设计 3、网络接入3.1 接入方式3.2 IPv6地址 4、综合布线技术5、物联网5.1物联网概念与分层5.2 物联网关键技术 6、云计算7、网络存储技术&#xff08…

网上订餐系统|基于springboot的网上订餐系统设计与实现(源码+数据库+文档)

网上订餐系统目录 目录 基于springboot的网上订餐系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户功能模块的实现 &#xff08;1&#xff09;用户注册界面 &#xff08;2&#xff09;用户登录界面 &#xff08;3&#xff09;菜品详情界面 &#xff08…

网站创建的流程是什么

网站的创建过程包括几个主要的步骤&#xff0c;其中涉及到一系列的决策和实践操作。下面我将详细介绍网站创建的流程&#xff0c;帮助读者了解如何创建一个成功的网站。 第一步&#xff1a;确定网站目标和功能 在创建网站之前&#xff0c;你需要明确自己网站的目标和功能。是用…

自动生成接口文档coreapi

drf-yasg只能用于drf 去看官方文档 2 coreapi pip install coreapi 2.1 配置路由 from rest_framework.documentation import include_docs_urlsurlpatterns = [...path(docs/, include_docs_urls(title=站点页面标题)) ]2.2 drf配置 #AttributeError: AutoSchema object has n…

OpenTelemetry入门看这一篇就够了

分布式跟踪可以帮助查看整个请求过程中服务之间的交互,并可以让我们深入了解系统中请求的整个生命周期。它帮助我们发现应用程序中的错误、瓶颈和性能问题。OpenTelemetry 可以用于从应用程序收集数据。它是一组工具、API 和 SDK 集合,我们可以使用它们来检测、生成、收集和导…

HTML5漫画风格个人介绍源码

源码介绍 HTML5漫画风格个人介绍源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 效果截图 源码下载 HTML5漫画风格…

Big Data and Cognitive Computing (IF=3.7) 计算机/大数据/人工智能期刊投稿

Special Issue: Artificial Cognitive Systems for Computer Vision 欢迎计算机/大数据/人工智能/计算机视觉相关工作的投稿&#xff01; 影响因子3.7&#xff0c;截止时间2024年12月31日 投稿咨询&#xff1a;lqyan18fudan.edu.cn 投稿网址&#xff1a;https://www.mdpi.com/j…

交换机丢包问题

一、测试丢包的方法二、丢包的类型链路丢包拥塞丢包MAC地址漂移STP震荡二三层表项超规格

linux查看mysql占用磁盘空间

linux查看mysql占用磁盘空间 1.通过ps -ef | grep mysql命令查看mysql相关信息,找出mysql的data目类:2.检查数据目录大小 du -sh /home/db_mysql/mysql

华为OD-C卷-攀登者1[100分]

攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。 地图表示为一维数组,数组的索引代表水平位置,数组的元素代表相对海拔高度。其中数组元素0代表地面。 例如: [0,1,2,4,3,1,0,0,1,2,3,1,2,1,0],代表如下图所示的地图 地图中有两个山脉位置分别为 1,2,3,4,5 和 8,9,1…

6-01. Timeline 创建

创建 Intro Canvas注意,把 Intro Canvas 的 Sort Order 改为 10,确保可以完全遮盖其它物品 添加 PanelColor 改成 11102E新建 New Game Cutscene把文件放到 GameData / Timeline为了方便操作,可以把右上方改成秒 声音切割的办法在最后的时候添加关键帧,包括坐标、大小、是否…

6-02. 创建 Timeline 的对话

修改 NewGame Cutscene选择 Add Active Track 创建新场景创建 DialogBehaviour创建 DialogClip创建 DialogTrack修改 DialogBehaviour编辑 DialogClip 首先添加 DialogTrack,然后再 Add Dialog Clip可以把 Has To Pause 勾选一下 再添加一个 DialogClip修改 DialogBehaviour创…

记一次“XMR门罗币挖矿木马病毒”处置

记一次“XMR门罗币挖矿木马病毒”处置一、背景概述 故事的起因于26号下午做渗透测试时,登录跳板机发现CPU进程拉满到200%,qiao哥看了一眼直接说是XMR挖矿,这句话勾引起我的兴趣,由于应急是我的薄弱项也没有时间深入学习,所以有本篇应急分析文章。 市面上存在很多关于XMR门…

Java | Leetcode Java题解之第36题有效的数独

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isValidSudoku(char[][] board) {int[][] rows new int[9][9];int[][] columns new int[9][9];int[][][] subboxes new int[3][3][9];for (int i 0; i < 9; i) {for (int j 0; j < 9; j) {char …

中电金信:2023银行年报分析——金融科技发展新格局(下篇)

​ ​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑 ​

电商技术揭秘二十八:安全与合规性保障

电商技术揭秘相关系列文章&#xff08;上&#xff09; 相关系列文章&#xff08;中&#xff09; 电商技术揭秘二十&#xff1a;能化供应链管理 电商技术揭秘二十一:智能仓储与物流优化(上) 电商技术揭秘二十二:智能仓储与物流优化(下) 电商技术揭秘二十三&#xff1a;智能…

Ubuntu部署有道QAnything(中间涉及到更换mysql容器端口)

系统配置版本:Ubuntu 20.04 有两块3090的显卡 下载相关文件首先下载源码,下载完成后解压得到QAnything-master文件夹 github下载地址:https://github.com/netease-youdao/qanything gitee下载地址:https://gitee.com/netease-youdao/QAnything?_from=gitee_search 下载emb…

B端系统:表单页设计全方位指南,超详细。

一、什么是表单页 B端系统表单页面是指面向企业或机构客户的系统中的表单页面。B端系统是指面向商业客户或机构的系统&#xff0c;与C端系统&#xff08;面向普通消费者的系统&#xff09;相对应。 在B端系统中&#xff0c;表单页面通常用于收集和处理企业或机构客户的信息。这…

实验一 球赛直播app

墨刀、Axure、Mockplus等原型设计工具优缺点分析: 一、墨刀 优点:在轻量级的移动端原型制作更加迅速,展示更加方便。 缺点:价格较贵,不能画流程图,相对于其他两款功能还不是很全面;应用局限性,专注于app原型设计,在后台和网页稍有乏力;归档能力不足,更倾向于链接、二…