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

C语言—再学习(数据的存储类别)

在c语言中,每个变量和函数都有两个属性:数据类型数据的存储类别

C的存储类别包括4种:自动挡(auto)、静态的(static)、寄存器的(register)、外部的(extern)。

一、自动变量(auto变量)                                                                                     

定义和使用:在函数内部定义的变量默认是 auto 存储类别,也可以显式地使用 auto 关键字来声明。

作用域和生存期:自动变量的作用域仅限于定义它的函数或代码块,当函数执行结束时,自动变量的生存期结束,其所占用的内存被释放也就是说,自动变量在函数调用时创建,函数返回时销毁。

二、静态局部变量(static局部变量)                                                                    

 局部静态变量:在函数内部使用 static 关键字声明的变量为局部静态变量。局部静态变量在程序运行期间只初始化一次,之后每次调用函数时,其值会保留上一次调用结束时的值

int func() {static int count = 0;  // 局部静态变量count++;return count;
}

全局静态变量:在函数外部使用 static 关键字声明的变量为全局静态变量。全局静态变量的作用域仅限于定义它的文件,其他文件无法访问该变量。其生存期同样从程序开始运行到程序结束。 

static int global_static_var = 10;  // 全局静态变量int main() {// 在此处可以使用global_static_varreturn 0;
}

注:静态存储要多占内存(长期不释放),而降低了程序的可读性,调用次数过多往往弄不清当前值,因此非必要,不要多用。

三、寄存器变量(register 变量)                                                                                

定义和使用:register 关键字用于建议编译器将变量存储在寄存器中,以提高访问速度。但编译器有最终决定权,不一定会将变量放入寄存器。

适用场景:通常适用于频繁使用的变量,如循环中的计数器等。但由于寄存器数量有限,且编译器会进行优化,实际应用中使用 register 关键字的情况相对较少。

四、外部存储类别(extern)                                                                                     

 声明外部变量:当一个变量在一个源文件中定义,而在另一个源文件中使用时,可以使用 extern 关键字来声明该变量。例如,在 file1.c 中定义了一个变量:

// file1.c
int global_var = 10;

在 file2.c 中使用该变量:

// file2.c
extern int global_var;  // 声明外部变量
int main() {// 可以在此处使用global_varreturn 0;
}

 声明外部函数:extern 也可以用于声明外部函数,当一个函数在一个源文件中定义,而在另一个源文件中调用时,可以使用 extern 声明函数,虽然在实际应用中,函数声明时 extern 关键字常常省略,但原理上是使用了 extern 来声明外部函数。

// file1.c
int add(int a, int b) {return a + b;
}// file2.c
extern int add(int a, int b);  // 声明外部函数
int main() {int result = add(3, 5);return 0;
}

http://www.dtcms.com/a/188194.html

相关文章:

  • 大模型——Crawl4AI为 LLM 和 RAG 准备高质量网页数据
  • electron 基础知识
  • 服务器租用与托管注意事项有哪些
  • 互联网大厂Java求职面试:优惠券服务架构设计与AI增强实践-4
  • Python Day 24 学习
  • 亚马逊云科技:开启数字化转型的无限可能
  • LeetCode 3335.字符串转换后的长度 I:I先递推
  • 标贝科技:大模型领域数据标注的重要性与标注类型分享
  • Linux——守护进程
  • 改变应用的安装目录
  • 浅谈 Redis 数据类型
  • pdf url 转 图片
  • CSV注入攻击技术解析
  • Spark SQL 读取 CSV 文件,并将数据写入 MySQL 数据库
  • 【认知思维】过度自信效应:高估自我能力的认知偏差
  • 【Pandas】pandas DataFrame cumprod
  • PostgreSQL 服务器信号函数
  • ZYNQ实战:可编程差分晶振Si570的配置与应用指南
  • 安卓刷机模式详解:Fastboot、Fastbootd、9008与MTK深刷
  • 项目:博客系统——基于SSM框架Mybatis-plus
  • 基于 Spring Boot 瑞吉外卖系统开发(十三)
  • Vxworks 系统详解
  • 装饰器在Python中的作用及在PyTorchMMDetection中的实战应用
  • 我国城市轨道交通行业人工智能大模型发布,迈向智慧化新征程​
  • 本地的ip实现https访问-OpenSSL安装+ssl正式的生成(Windows 系统)
  • Java【10_1】用户注册登录(面向过程与面向对象)
  • tomcat搭建内网论坛
  • 【论信息系统项目的资源管理】
  • docker大镜像优化实战
  • 专题三:穷举vs暴搜vs深搜vs回溯vs剪枝(全排列)决策树与递归实现详解