【C语言】变量、变量的存储区域和存储类型

变量:即在程序运行过程中数值可变的数据;为提高程序的可读性,变量名一般由用户根据其用途自行命名,变量名由字母、数字、下划线组成,且不能以数字开头,不能与C语言的关键字重名;在程序运行时,变量占内存空间的大小由其数据类型决定。在使用前,必须声明变量,一般格式:
<存储类型> <数据类型> <变量名>;
局部变量:在所有函数内定义的变量(包括函数参数)都是局部变量。程序中一般都是局部变量,另外局部变量只在自己的函数内有效,即不可被其他函数使用,因此不同函数的局部变量可以重名而不引起冲突
全局变量:在函数体外定义的变量为全局变量。在整个程序运行阶段都占用内存不被释放;在定义后,同一源文件下其后面的全部函数都可访问它(除函数内有同名的局部变量外,当局部变量和全局变量同名时,局部变量起作用,全局变量在该函数内被屏蔽);全局变量在程序中带来了方便,实现了同一源文件下函数间的数据传输,但也破坏了程序模块的封装性和数据安全性,一般不能多用。

变量的存储区域:变量的存储类型决定了其存储区域,运行一个程序时,系统会分配一块内存用来存放代码和各种变量,内存分为三个区域:程序代码区、全程数据区和短程数据区(堆栈区)。变量存储在内存中或寄存器中。
变量存储区域

变量的存储类型:
auto(自动存储):修饰的变量存储在堆栈区,习惯上省略不写,如没有其他存储类型修饰则默认为自动存储;auto型的局部变量随函数调用而生成,函数调用结束而释放,一般用得较多。如修饰的变量不进行初始化,则系统会随机给一个值。 (auto) int i。
static(静态存储):修饰的局部变量存储在全程数据区,静态局部变量在程序运行中也不会被释放,直至程序结束,因此有记忆功能,每次调用都保留上一次操作的值;修饰的全局变量只能被本文件内的函数使用,其他源文件不可访问。如修饰的变量不进行初始化,则系统默认赋为0。
static int i;
extern(外部存储):用来修饰全局变量,修饰的变量是其他的源文件的全局变量,表示在该文件下引用了其他源文件的的全局变量,实现了不同源文件的数据传输(但用static修饰的全局变量不可被其他文件访问)。
extern int i;
register(寄存器存储):修饰的局部变量存储在寄存器中,若变量被频繁使用,则可缩短变量的操作时间,加快程序的运行速度。一般修饰的变量不能太多且数据长度应该小于或等于整数的长度,因为寄存器数量有限且主要工作不是用来存储的,定义多了系统会自动把多出的register变量当做auto处理。只能应用于auto变量或者函数的形参,且不能用&取地址。
register int i;

另外,extern修饰的函数同修饰全局变量功能相似,可省略不写;static修饰的函数也称内部函数,只有同一源文件内的函数才可调用。


#以上是在零乱的大脑里整理出来的一些基本知识,如有疑问或者建议,欢迎大家提出和讨论呀!

### C语言中的变量存储类型 #### 存储类型的概述 C语言提供了四种主要的存储类说明符来控制变量的生命周期作用域:`auto`, `register`, `static`, `extern`。这些关键字用于指定编译器如何处理特定变量,影响其内存分配位置以及访问权限。 对于自动(`auto`)变量而言,这类通常是默认情况下定义于函数内部或者复合语句内的局部对象;它们被创建并初始化当进入相应的作用范围时,并且一旦离开该区域就会销毁[^1]。 注册表(`register`)提示编译尝试将此变量保存在一个机器寄存器里而不是RAM地址上以加快读写速度——但这并不总是可能实现取决于具体硬件架构其他因素限制[^2]。 静态(`static`)修饰符可用于两种情况下的变量声明: - 当应用于全局范围内(文件级别)的对象时,则意味着它仅限于此源代码单元内可见; - 如果放置在函数体内作为局部实体前缀的话,则表示即使函数执行完毕之后仍然保持原值不变直到整个应用程序终止为止[^3]。 外部链接(`extern`)允许跨多个翻译单位共享相同名称的数据项而无需重复定义多次;通常用来引用已经在别处确切给出过的全局符号[^4]。 #### 使用场景举例 ##### Auto (隐式) ```c void exampleFunction() { auto int localVariable = 0; } ``` 这里`localVariable`是一个典型的栈上的临时性实例,在每次调用结束后都会消失不见。 ##### Register 提示优化 ```c int sumArray(int array[], size_t n) { register int i, total=0; for(i=0 ; i<n ; ++i){ total +=array[i]; } return total; } ``` 尽管指定了`register`,实际能否成功依赖于目标平台特性及其可用资源状况。 ##### Static 局部持久化 ```c #include <stdio.h> void counter(){ static unsigned count = 0; printf("%u\n",++count); } // 调用counter会打印递增序列... ``` 上述例子展示了通过设置静态标志位使得计数器能在连续两次之间维持状态变化。 ##### Extern 全局共享 假设有一个名为`data.c`的文件含有如下内容: ```c /* data.c */ int sharedData = 42; /* 定义了一个具有外部连接性的整型 */ ``` 而在另一个地方如`main.c`中可以通过下面方式获取到它的副本而不必再次开辟新的空间: ```c /* main.c */ extern int sharedData; // 此处只是宣告而非真正建立新实体 printf("Shared Data Value:%d\n",sharedData); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值