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

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.xdnf.cn/news/5884.html

相关文章:

  • C++ 字符格式化输出
  • python学习笔记七(文件)
  • 分布式链路跟踪
  • lubuntu 系统详解
  • WebpackVite总结篇与进阶
  • Java SpringMVC 和 MyBatis 整合项目的事务管理配置详解
  • DeepSeek 赋能汽车全生态:从产品到服务的智能化跃迁
  • 2025年5月13日第一轮
  • vue3父子组件传值
  • 数据治理域——日志数据采集设计
  • c++STL-list的模拟实现
  • conda 输出指定python环境的库 输出为 yaml文件
  • K230 ISP:一种新的白平衡标定方法
  • AcroForm 格式化文本(域)字段
  • ElasticSearch父子关系数据建模
  • MySQL命令行导出数据(docker版本)
  • 运行Spark程序-在shell中运行1
  • 智源联合南开大学开源Chinese-LiPS中文多模态语音识别数据集
  • base64形式的图片数据保存方法
  • Redis介绍与使用
  • 【git】clone项目后续,github clone的网络配置,大型项目git log 输出txt,切换commit学习,goland远程,自存档
  • 关于maven的依赖下不下来的问题
  • Git基本操作命令
  • 专题四:综合练习( 找出所有子集的异或总和再求和)
  • 解锁Python TDD:从理论到实战的高效编程之道(9/10)
  • 时间序列预测建模的完整流程以及数据分析【学习记录】
  • 选择单例还是依赖注入
  • 【每天一个知识点】Dip 检验(Dip test)
  • CSS经典布局之圣杯布局和双飞翼布局
  • spark-cache模式