当前位置: 首页 > news >正文

C语言:变量三属性——存储类型

C语言变量具有三属性:类型,作用范围、存储类别

存储类别:

1、auto类别:

1.1、auto类别的变量使用完后释放所占用空间。

auto类别 = 临时变量

1.2、局部变量默认为auto类别无初始化时,初值为随机值。

局部变量(不是所有变量!!)不给初值并不意味着变量没有值,实际上是有的,而且是随机值。

1.3、使用时间短,一般都是auto类别的变量。

2、static类别:

2.1、static类别从定义到程序运行结束均占用存储空间。

占用时间比auto长。

2.2、全局变量默认为static类别,无初始化时,初值为0。

2.3、static类别变量只进行一次初始化。

案例1:

//09-6--001 #include <stdio.h> int fun(int x, int y) { static int m = 0,i = 2;//静态变量static i += m + 1; m = i + x + y; return m; } main() { int j = 4, m = 1, k; k = fun(j, m); printf("%d", k); k = fun(j, m); printf("%d", k); }

该案例是一个复合框架,由一个子函数fun()和一个主函数main()组成。

主函数调用子函数两次。

从主函数main开始执行,定义了3个局部变量j=4,m=1,k为随机值。

接着开始调用子函数,函数出门,出门时单向传值,将j=4与m=1传至子函数。

因此x=4,y=1,继续执行子函数fun(),定义了两个静态变量,分别是m=0,i=2,静态变量只做一次初始化,所以原代码中我们定义好m和i后,那一句带static的话就没有用了。

继续往下,i+=m+1,是先算m+1,放到i里,再进行累加。那么i此时i=2+1,i=3。继续往下,m=i+x+y,其中i=3,x=4,y=1,所以m=8。继续往下,return m,带着m的值返回,所哟就带着8返回了。

回到主函数原本调用的位置继续运行,k=fun(j,m),8这个值给了fun(),所以fun()=8,所以k=8,继续运行,打印k的值,输出打印8,光标在8后。

继续运行,再次调用子函数,函数出门,出门时单向传值,再次将j=4与m=1传至子函数。再次运行一遍子函数,但是前面已经用过一次static语句了,第二次再用,就会跳过static语句,注意注意,此时m的值就不是static初始化的0了,i的值也不是初始化的2了,而是沿用上一次留下来的数据,m=8,i=3继续使用。

继续往下运行,i+=m+1,是先算m+1,放到i里,再进行累加。m+1=8,8+1=9,此时就把9累加进i里,i=9+3=12,i变成12.继续往下运行m=i+x+y,i=12,x=4,y=1,所以此时m=17。继续往下,return m,那么就带着17回主函数了。

回到主函数,k=fun(),带回来的值是17,17这个值给了fun(),所以fun()=17,所以k=17,继续运行,打印k的值,输出打印17,光标在17后。

分析结束,所以最后的输出框输出的应该是817。我们上机看一下最终的效果:

重点体会static变量第一次调用和第二次调用之间的区别。认真体会“static类别变量只进行一次初始化”在代码中的具体体现。

案例2:

//09-6--002 #include <stdio.h> int d = 1; fun(int p) { static int d = 5;//静态变量static d += p; printf("%d", d); return (d); } main() { int a = 3; printf("%d\n", fun(a+fun(d))); }

代码开头有一个d,是全局变量。但是在子函数内也有一个d,是static变量,只做一次初始化。

在主函数内也出现了一个d,那么这个d就应该是全局变量d,因为子函数内的d的作用范围只在子函数内。因此主函数内的fun(d),其中的d=1。

开始分析。这是个包括一个子函数和一个主函数的复合框架。子函数在上无需声明。在主函数内调用子函数两次。最后printf。

fun()子函数前没有规定类型,那fun()返回什么类型?应该是默认返回Int类型,int类型即非void类型,一定要加return。

从主函数进入,开始执行,首先定义了一个a=3,接下来在printf语句内开始两次调用fun()函数,先调用内层的函数fun(d),我们已知d=1,调用完内层的函数,会返回一个值,来与前面的a相加继续计算,再进行一次调用。

好,那么开始调用fun(d),函数出门,前往fun()单向传值,那么p=1。继续往下,static int d=5,单次初始化,那么d此时被初始化为5,d=5,初始化结束后static语句失效。继续往下,d+=p,将p的值累加进d后再赋值给d,所以此时d的值被更新为6,printf语句输出d的值,即输出一个6。继续往下return语句,带着d的值d=6,返回原先调用的地方。

回到主函数,fun(d),带回来的值是6,6这个值给了fun(),所以fun(d)=6,带入前面的式子,那么变成了fun(a+6)。又因为原a=3,所以fun(9),将会再调用一次fun,这次带入的值是9。

好,那么开始调用fun(9),函数出门,前往fun()单向传值,那么p=9。继续往下,static语句已经失效了,忽略不看,直接运行d+=p,此时将p的值累加进d后再赋值给d,p=9,d=6,d的值沿用上一次调用留下来的值,所以此时d的值被更新为15。继续往下打印d的值,所以打印15。继续往下,带着15这个值回到原先调用的主函数的地方。

回到主函数,那么此时fun(a+6)的值已被更新为15。printf语句打印15,且换行。

分析结束,所以最终应该输出61515回车,光标在下一行开头。我们上机看一下最终的效果:

重点体会static变量第一次调用和第二次调用之间的区别。认真体会“static类别变量只进行一次初始化”在代码中的具体体现。

3、register类别(寄存器类别):

3.1、register类别变量只能是局部变量才能被说明。

3.2、register类别变量一般不能直接使用

4、extern类别:

4.1、extern类别变量可以加大变量的作用范围(外部)

案例3:

//09-6--003 #include <stdio.h> main() { printf("%d,%d\n", x, y); } int x, y;

可以看到,本案例希望可以实现输出x和y,但是代码实际上是先使用,再定义,原本c语言中应该先定义后使用,所以在编译是就会提醒未声明。

但是我们代码末尾有定义呀,那么我们就可以通过extern来加大x和y的作用范围。

增加语句:extern x,y;

增加句子之后程序正常运行。

4.2、格式说明:

格式1(auto、static、register只能使用格式1):定义的同时说明类别:

存储类型 类型名 变量名;

eg:auto int x;-----auto可省略

static int x;-----YES

格式2(extern可以用格式1也可以用格式2):分别定义,说明:

类型名 变量名;

存储类型 变量名;

eg:extern int x;或者 int x;extern x;

学习过程有诸多不足之处,欢迎来私信与我一同交流学习,共同进步!

http://www.jsqmd.com/news/1375221/

相关文章:

  • 2026年北京丰台区GEO服务商代理加盟怎么选?本地靠谱推荐与避坑指南 - 企业新闻快传
  • WebGL 原型落地:怎样变成可维护的 3D 可视化功能
  • 2026年度实验室定风量阀性能评选 - 资讯报道
  • 5个核心技巧掌握ComfyUI-WanVideoWrapper:AI视频生成实战指南
  • LBS业务踩坑实录、为什么不建议项目混用多家地图SDK
  • 2026寄件省钱评测:避坑实测攻略 - 快递物流实时资讯
  • 2026亚马逊平台算法喜欢推什么产品?AI推荐机制下的6个共同特征
  • 广州天河写字楼无线打印机频繁脱机?Win10/Win11 零基础完整自查修复教程
  • 香港移民公司挑花眼?先看这五家市场格局再定 - 北极星移民
  • 寄快递省钱实测:一年省几百的推荐 - 快递物流实时资讯
  • 如何快速掌握ncmdumpGUI:网易云NCM文件解密工具的完整使用指南
  • 如何用10分钟语音数据打造专业级AI音色克隆:RVC变声器完整指南
  • 终极Duc命令参考:从入门到精通的磁盘管理技巧
  • 2026年北京昌平区GEO服务商代理加盟怎么选?本地靠谱推荐与城市合伙人布局指南 - 小随科技
  • 贵州大学J. Mater. Chem. A:焦耳热秒级处理NiFe泡沫表面原位构建NiFeMo-O,碱性HER稳定3000小时
  • 2026衡阳楼顶漏水避坑指南 - 企业资讯
  • 高一致性系统性能剖析与调试:Profiler与Debug工具深度联动实战
  • 2026年上海闵行区GEO服务商代理加盟怎么选?本地靠谱推荐与启动指南 - 小随科技
  • 2026年快手中医团购入驻避坑指南:供应商必看3大核心标准
  • 2026实验室定风量阀专业推荐 - 资讯报道
  • Oxidized实战指南:构建企业级网络设备配置备份系统
  • 3大核心优势深度解析:Langfuse如何重塑LLM应用的可观测性架构
  • 代谢组学实验伯远生物代谢组学实验
  • 软考网络工程师|第 7 章 UOS/Linux 系统运维完整备考笔记
  • 如何快速将电子书转为有声书:1158种语言的终极指南
  • 2026娄底楼顶漏水避坑指南 - 管道一点通
  • 2026年北京顺义区GEO服务商代理加盟怎么选?本地靠谱推荐与避坑指南 - 科技快讯
  • Web2靶机实战:从入侵痕迹分析到应急响应全流程
  • 2026年上海虹口区GEO服务商代理加盟怎么选?本地靠谱推荐与合作指南 - 子柔传媒
  • 广州花都区GEO服务商代理加盟怎么选?本地靠谱推荐与城市合伙人模式全解析 - 小随科技