C语言基础:函数(二)

发布时间:2026/9/21 2:23:40

C语言基础:函数(二) 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函数的递归在函数内部自己调用自己的函数调用被称为函数的递归。属于循环的一种 表现形式。 区别会使用栈空间。注意需要设置合理的退出条件。递归的层次不要太深会消耗大量的内存可能导致程序崩溃。应用回溯类 逆向思维的问题的。
延伸阅读

更多相关文章

2026/9/20 1:48:31

SMPL-X三维人体建模实战:从原理到单图重建与部署

1. 项目概述:从“火柴人”到“数字真人”的进化 在计算机视觉和图形学领域,让机器理解并重建一个三维的人体,一直是个既迷人又充满挑战的课题。我们常说的“人体捕捉”,其终极目标远不止于得到一个会动的“火柴人”骨架。想象一下…

2026/9/19 10:55:17

Python实战:构建大型活动人流模拟与热力分析系统

1. 背景与核心概念:BW展会与大型活动人流管理BW,即Bilibili World,是哔哩哔哩(B站)举办的大型线下嘉年华活动。它不同于传统的漫展或游戏展,其核心特色在于将B站的线上社区文化、UP主生态、热门IP&#xff…

2026/9/19 10:55:15

AI生成标准Word文档的技术方案与实践

1. 为什么需要AI生成标准Word文档?在办公自动化领域,Word文档仍然是企业内外沟通的黄金标准。我经历过无数次这样的场景:凌晨两点还在手动调整文档格式,只为让客户第二天能看到符合公司模板的标书。直到三年前开始系统研究AI文档生…

2026/9/21 2:22:31

SAP按销售订单结算全攻略:配置、实操与避坑指南

简介:按销售订单结算是SAP成本控制模块中的高频复杂场景,本资料面向SAP顾问、实施工程师、成本会计及售前人员,系统讲解无差异模式与有差异模式下的配置与操作差异。文档从生产订单结算配置、销售订单成本控制、结果分析到最终结算逐层拆解&a…

2026/9/21 2:22:31

华为昇腾Atlas 300V 24G部署YOLO全流程与性能调优实战

1. 从“atlas”这个词说起:它到底指什么第一次看到“atlas”这个项目标题,很多人脑子里会蹦出好几个完全不同的东西。做前端的会想到地图集,做数据库的会想到MongoDB Atlas,做AI推理的会想到华为昇腾Atlas系列硬件,做机…

2026/9/21 2:22:31

Local-First RAG架构:实现毫秒级响应的关键技术

1. 项目概述:Local-First RAG架构的核心价值在信息检索领域,延迟始终是影响用户体验的关键指标。传统基于云端的RAG(Retrieval-Augmented Generation)架构虽然功能强大,但受网络传输、服务端负载等因素制约&#xff0c…

2026/9/21 2:22:30

Python+torch实现PINN求解二维Helmholtz方程:从低频到高频的实战指南

第一次把PINN跑通的时候,说实话没有太多成就感,因为在二维Helmholtz方程上它表现得相当一般。当方程里的波数k从7提到15,普通多层感知机的解就开始“摆烂”,损失曲线降不下去,数值解和解析解差得离谱。折腾一段时间后我…

2026/9/20 0:04:49

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/20 0:04:49

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/21 0:02:23

OpenResearch:构建可复现的开放式研究工作流

第一次看到“OpenResearch”这个名字,我脑子里冒出的不是某个具体软件,而更像一种研究方式的宣言:开放、可复现、可验证。这三件事放在一起,其实比大多数人想象中难得多。过去几年我一直在折腾自己的研究工作流,从纯纸…

2026/9/20 4:54:47

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/20 5:01:23

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/20 5:09:33

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码