C语言基础:函数
一段功能代码被称为函数。为了避免代码的重复。 复用性。 开发不用从头开始(库函数)。模块化的思想 。 大问题分解成小问题逐个解决。设计函数 高内聚低耦合。 功能越单一越好 对外部依赖越少越好。函数在使用前需要先定义(告诉编译器有这个功能)在使用。 定义是包含(声明)。1函数的定义​ 函数返回值 函数名(参数类表) { ​ 函数体 return x } ​ 参数列表 (数据类型 形式参数1,数据类型 形式参数2数据类型 形式参数3...) 函数返回值 数据类型 函数在调用完毕后一般情况都是有结果值。 这个值就有数据的类型 。 如果函数的返回值 设计为void 那么函数调用(使用)后没有结果也就没有数据。 ​ ​1.如果设计函数的时候没有给定函数返回值的 默认是int 。如果确实没有什么需要返回的可以是void 。如果函数的执行流程运行到return 是返回到函数的调用处。 return后的代码将不会被执行。参数在传递的过程中需要保证参数的个数一致类型 匹配类型一致或可以隐式类型转换。​ ​ //函数的定义 实现具体 int add() { int a 20; int b 10; int ret ab; return ret; // 返回结果返回函数调用的地方。 } ​ int main() { int result add(); // 函数的使用,() 表示调用函数 int result ret; int result 30; printf(result is %d\n,result); return 0; } ​2函数的调用void fun1() {} void fun2(int arg1,int arg2) 形参形式参数 {} ​ 函数后面的圆括号不可以省略。 ​ 函数名(); // fun1(); int a0, int b20 ; // 参数个数一致 数据类型也一致。 函数名(arg1,arg2); // fun2(a,b); 实参实际参数//函数的定义 实现具体 int add() { int a 20; int b 10; int ret ab; return ret; // 返回结果返回函数调用的地方。 } ​ int main() { int result add(); // 函数的使用,() 表示调用函数 int result ret; int result 30; printf(result is %d\n,result); return 0; } ​ 主调函数在这个示例中main 是主调函数。调用功能的发起者。 被调函数 在main中使用add的功能add 就是被动调用的函数。3函数的声明在实际代码编写过程。没有办法保证 函数的定义一定在函数的调用前出现 (多文件编程)。编译器在编译的过程中就会出现未登记函数就会警告。为了避免这种情况 就要对函数进行声明。int add(int a,int b) //声明 ​ int main() { .... add(12,4*5); // 函数的调用但是函数的定义在后面定义的这时 会出现警告。 .... ​ } int add(int a,int b) { return ab; } ​ int add(int a,int b) 函数的原型函数头。 包含函数名参数列表(参数的个数,每个参数的数据类型) 返回值的数据类型。4变量的作用域和生命周期作用域 变量定义后可以被访问的区域。局部作用域 局部变量变量作用域在离定义该变量最近的大括号内。当发生函数调用后作用域发生了变化在被调函数内部在主调函数内部定义的变量都不能使用。#include stdio.h ​ int add() { return ab; // 不能访问到主调的 a,b 变量 。 } ​ int main() { int a 10; //局部作用域 int b 20;//局部作用域 int c add(); return 0; } ​全局作用域 全局变量在所有的源文件( 同一个工程中 所有.c) , 在任意位置都可以直接使用的区域。变量的定义放在所有函数的外面。 就是全局变量int a 10; // 全局变量 整个工程中任意位置都可以被访问。 int b 20; int add() { return ab; } ​ int main() { int c add(); printf(c is %d\n,c); return 0; }生命周期变量从开辟内存空间开始 到 变量的内存空间的回收 结束 的这个时间段被称为生命周期。局部变量1 函数内部定义的变量函数的参数函数内部定义的变量一定要给初值。如果没有给就是随机值在定义开始的地方申请内存。 执行到函数结束空间回收。全局变量1.在所有函数之外定义的变量。可以给初值。如果不给初值 由系统负责初始化为0 全局变量在a.out 正式运行起来前就要把空间开辟好在程序结束后空间释放 。全局变量有全局生命周期。在同一个作用域中标识符(变量名数组名函数名) 不能同名。如果一个作用域大一个作用域小出现同名标识符。 出现隐藏。变量的隐藏int a 10; int b 20; int add() { return ab; } ​ int main() { int a 1; int b 3; int c add(); int d ab; // 这个地方使用的是局部变量。全局变量被隐藏。 printf(c is %d\n,c); return 0; } ​5变量的存储类型存储类型 数据类型 变量名 ​ 1. auto int a; 用的相对少 2. register int b; 用的相对少 3.extern int c; 4.static int d;auto , 自动存储类型 。 局部变量。 这个关键字 可以省略 。定义变量时内存空间自动开辟离开作用域是自动释放。内存的栈区(stack)。 函数内部定义的变量函数的参数。register ,寄存器 . 建议编译器把某个变量存储在cpu的寄存器中。register int c;extern , 外部变量。 声明。 导出目的是为了让其他的源文件可以使用.1.c #include stdio.h extern int a; // 声明表示有这个变量在其他的.c 中 extern int b; extern void fun(); int main() { int c ab; printf(ab %d\n,c); fun(); } ​ ​ 2.c int a 10;// 定义开辟内存空间 int b 20; ​ void fun() { } gcc 1.c 2.c4.static 静态的可以修饰变量或函数。 用static 修改的变量内存的数据区。​ static 修改局部变量 如果局部变量前加 static 变量的生命周期是整个程序运行的周期。 第一运行fun函数时 i 分配空间初始化。 如果不是第一次运行这个变量 就不会在分配空间和初始化。相当于 static int i 0这段没有 了。 ​ int fun() { ​ static int i 0 ;// 全局生命周期 i; return i; } ​ int main() { ​ int num 0; printf(input num); scanf(%d,num); int j 0 ; int count 0 ; for(j0;jnum;j) { count fun(); } // i 20; //errror 不能访问i。 i本身是存在但是没在i的作用域范围内。 printf(count is %d\n,count); return 0; } ​static 修饰全局变量的话表示 这个变量只能在本模块(本源文件中 依然全局变量)中使用。其他的源文件 不可以使用。 static 的作用 限制作用域。static 修饰函数的话。 static 的作用 限制作用域。 避免函数重名。a.out 运行起来后的内存分布图1,代码段 存储的是编写的代码二进制形式。只读。 2.数据段全局变量静态变量。没有给初值系统全部初始化为0 。可读可写 3. 堆区动态内存区。程序员手动申请和释放空间。最灵活 4.共享区 库函数的实现。printf函数的定义。 5 栈区 局部变量。函数的参数。 返回地址。内存自动申请自动释放。6函数调用调用前必须先定义。使用圆括号 函数调用运算符。 add(); ,即使函数的调用没有参数括号不能省略。如果需要传递参数话传递参数的 个数保持一致参数类型的需要匹配。函数的调用过程 #include stdio.h void fun3() { printf(this is fun3...\n); return ; } ​ void fun2() { fun3(); printf(this is fun2...\n); return ; } ​ void fun1() { fun2(); printf(this is fun1...\n); return ; } ​ int main() { fun1(); printf(this is main...\n); return 0; } ​函数参数的传递值传递 实参把参数数据的内容通过赋值运算符给 形参的形式。 形参是实参的一个副本(复制品)。数据内容是相同的实参的内存空间和形参的内存是独立。 没有办法通过修改形参来达到修改实参的目的。值传递只能读取实参的值 不能就行修改。#include stdio.h ​ void fun(int arg) { arg; printf(fun arg:%d\n,arg); } void swap(int a,int b) { int t 0 ; t a; a b; b t; printf(swap a:%d b:%d\n,a,b); } int main() { int i 10; fun(i); printf(i:%d\n,i); ​ int a 20; int b 1; swap(a,b); printf(main a:%d,b:%d\n,a,b); return 0; } ​2.地址传递 实参传递变量的内存地址值。 即可以读实参的 数据的值 也可以修改。一维整形数组做参数 本质是地址传递。​ ​ void fill_array(int a[],int size)// int [] a; // 如果是整形数组的化还需要数组的大小 { // 如果实参是数组类型在被调内部会降级为指针( 8 byte ,是数组在内存中的一个编号) // int size sizeof(a)/sizeof(a[0]); int i 0 ; for(i0;isize;i) { // 这个不是值传递 所以可以修改数组。 a[i] rand()%30; } // printf(sizeof is a %lu\n,sizeof(a)); // printf(sizeof is a[0] %lu\n,sizeof(a[0])); } ​ int main() { srand(time(NULL)); int array[10]{0}; int size sizeof(array)/sizeof(array[0]); fill_array(array,size);// int [] return 0; } ​ 函数版本 遍历 逆序 排序 冒泡选择一维字符数组的传参 本质是地址传递。// 对于字符数组(字符串)而言 约定以\0 结尾。 // 所用可以通过判断\0 的位置可以得出字符串的长度。 // 所以不需要传入 size int mystrlen(char a[]) // 依然是地址传递可以对数组对写操作 { // sizeof(a) 8byte int len 0 ; while(1) { if(\0!a[len]) { len; } else { break; } } return len; } ​ int main() { char str[100]{0}; // char [] ​ printf(input string1:); gets(str); // hello\0 int len mystrlen(str) return 0; } 函数版本 遍历 mystrcmp mystrcpy mystrcat mystrlen ​7函数的递归在函数内部自己调用自己的函数调用被称为函数的递归。属于循环的一种 表现形式。 区别会使用栈空间。注意需要设置合理的退出条件。递归的层次不要太深会消耗大量的内存可能导致程序崩溃。应用回溯类 逆向思维的问题的。

相关新闻

[SECS/GEM研究] (五) SECS-II 是什么

[SECS/GEM研究] (五) SECS-II 是什么

SECS/GEM 协议栈开发笔记 第 5 篇 基于代码库:Libsecs(一个 C 实现的 SEMI 协议栈) 说在前面:由于工作的原因,本人早些年开发了一套SEMI标准的协议栈用于公司的SECS标准实现,为了防止经验遗忘,…

2026/8/1 5:53:58 阅读更多 →
2026 边缘 AI 年中趋势报告:从芯片、模型到应用的三层技术浪潮全面总结与展望

2026 边缘 AI 年中趋势报告:从芯片、模型到应用的三层技术浪潮全面总结与展望

2026 边缘 AI 年中趋势报告:从芯片、模型到应用的三层技术浪潮全面总结与展望 一、芯片层:算力密度与能效比的军备竞赛 2026 年上半年的边缘 AI 芯片市场,呈现出三条清晰的技术路线并行演进的态势。第一条是以 NVIDIA Jetson Orin 系列为代…

2026/8/1 5:52:58 阅读更多 →
2026年AI论文写作工具全景测评与使用指南

2026年AI论文写作工具全景测评与使用指南

1. 2026届AI论文助手全景观察过去三年间,AI论文写作工具经历了从简单语法检查到全流程智能辅助的跃迁。根据Nature最新调研,83%的研究者已在论文创作中至少使用过一种AI工具,这个数字在研究生群体中高达97%。2026年最显著的变化是工具开始深度…

2026/8/1 5:52:58 阅读更多 →

最新新闻

【电脑科普】内存条的简单科普!

【电脑科普】内存条的简单科普!

内存条是连接CPU 和其他设备的通道,起到缓冲和数据交换作用。 当CPU在工作时,需要从硬盘等外部存储器上读取数据,但由于硬盘这个“仓库”太大,加上离CPU也很“远”,运输“原料”数据的速度就比较慢,导致CPU…

2026/8/1 15:14:29 阅读更多 →
SPI通信中NSS/CS片选机制详解与常见问题排查实战指南

SPI通信中NSS/CS片选机制详解与常见问题排查实战指南

1. 项目概述:SPI通信中的“守门员”与“绊脚石”搞嵌入式开发,尤其是涉及到各种传感器、存储芯片或者显示屏驱动,SPI(Serial Peripheral Interface)总线绝对是绕不开的老朋友。它简单、高效、全双工,看起来…

2026/8/1 15:14:29 阅读更多 →
Godot4 2D游戏角色遮挡透明化:Area2D与TileMapLayer实战方案

Godot4 2D游戏角色遮挡透明化:Area2D与TileMapLayer实战方案

1. 项目概述与核心价值在Godot4里做2D游戏,尤其是俯视角或者横版卷轴,角色和场景的交互是个绕不开的课题。一个常见的需求是:当角色走到建筑、树木等遮挡物后面时,我们希望遮挡物能变得半透明,让玩家始终能看清角色的位…

2026/8/1 15:14:29 阅读更多 →
3分钟搞定!Blender3mfFormat插件:3D打印工作流的终极解决方案

3分钟搞定!Blender3mfFormat插件:3D打印工作流的终极解决方案

3分钟搞定!Blender3mfFormat插件:3D打印工作流的终极解决方案 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 还在为Blender无法直接处理3MF文件而…

2026/8/1 15:14:29 阅读更多 →
实战指南:如何用GrapesJS可视化编辑器快速构建响应式网页

实战指南:如何用GrapesJS可视化编辑器快速构建响应式网页

实战指南:如何用GrapesJS可视化编辑器快速构建响应式网页 【免费下载链接】grapesjs Free and Open source Web Builder Framework. Next generation tool for building templates without coding 项目地址: https://gitcode.com/GitHub_Trending/gr/grapesjs …

2026/8/1 15:14:29 阅读更多 →
ScanTailor Advanced终极指南:5个技巧让你的扫描文档处理效率翻倍

ScanTailor Advanced终极指南:5个技巧让你的扫描文档处理效率翻倍

ScanTailor Advanced终极指南:5个技巧让你的扫描文档处理效率翻倍 【免费下载链接】scantailor-advanced ScanTailor Advanced is the version that merges the features of the ScanTailor Featured and ScanTailor Enhanced versions, brings new ones and fixes.…

2026/8/1 15:13:29 阅读更多 →

日新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/8/1 13:02:46 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/8/1 5:19:34 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/8/1 10:33:33 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →