C语言中【变量】的存储类型共有4种类型
在C语言中,对变量的存储类型说明有以下四种:
auto 自动变量 (动态存储)
register 寄存器变量(动态存储)
extern 外部变量(静态存储)
static 静态变量(静态存储)
所谓存储类型是指变量占用内存空间的方式,也称为存储方式。
这4种类型 不允许重复定义 如: extern static int a=200;是错误的;只能指定一中存储类型;如;static int a =200;或者是 extern int a;
变量的存储方式可分为“静态存储”和“动态存储”两种。
静态存储变量:在定义时候存储单元里一直保持不变;直到程序结束。
动态存储变量:在程序执行时候;使用他的时候才分配内存单元,使用完毕后立即释放,再使用在分配。
从以上分析可知,静态存储变量是一直存在的,而动态存储变量则时而存在时而消失。
一个变量属于哪一种存储方式,并不能仅从其变量作用域(文件,函数体,代码块,函数声明)来判断,还应有明确的存储类型说明;
如:static int a=20;
变量说明的完整形式应为:【存储类型说明符】【 数据类型说明符】【 变量名,变量名....】;
一、从作用域看:
1)全局变量
具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。
当然,其他不包含全局变量的定义的源文件需要用extern关键字再次声明这个全局变量。
2)静态局部变量(只对自己函数体内有效可见)
静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束一直存在,
它和全局变量的区别在于全局变量对所有函数都是可见的,
而静态局部变量只对定义自己的函数体始终可见。
局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,
而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,
其所占用的内存也被收回。
静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,
它作用于定义它文件里,不能作用到其他文件里,
即被static关键字修饰过的变量具有文件作用域。
这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。
二、从分配空间看:
全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间。
全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。
这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,
当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一个源程序的其他源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其他源文件中引起错误。
(1)静态变量会放在程序的静态数据存储区(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
(2)变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。
从以上分析可以看出,把全局变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static这个说明符在不同的地方所起的作用是不同的。应予以注意:
Tips:
A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块之间的耦合度。
B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块之间的耦合度。
C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见;
D.如果我们需要一个可重入的函数,那么我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的函数)。
E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。
附加说明:
变量的存储类型
auto int a = 10;自动变量 系统默认都是自动变量默认不会初始化;会产生随机数
static int a=20; 默认会被初始化;并仅仅初始化一次;生命周期整个程序
extern int a; 外部变量(全局变量) 默认会被初始化;并仅仅初始化一次 生命周期整个程序
register int a; 存放在cpu寄存器当中;不能用static 修饰;并且只能是局部变量、要求性能高的时候用
如:
register int y = 10; //错误
int get(){
register int x = 10; //正确
}
函数的局部变量
{
作用域只在函数体内;//压到栈 ,使用完后会被弹出释放;
}
文件main.c
#include <stdio.h>
/*
auto 自动变量
register 寄存器变量
extern 外部变量
static 静态变量
*/
int a = 100; //全局变量 其他文件可以用extern调用
//register int x = 10; //错误
extern void get();
static int name2 = 490; //全局静态变量 其他文件无法使用
int main()
{
get(); //分配1次 栈的空间有可能不是同一个
get(); //分配1次 栈的空间有可能不是同一个
get(); //分配1次 栈的空间有可能不是同一个
return 0;
}
文件1:
#include <stdio.h>
int abc = 2; //默认auto类型 //
static int name = 8890;
//extern static int name2; //错误;不允许定义2个存储类型
void get(){
extern int a;//引用全局变量
int aa = a;
a++;
auto int b = 20;
b++;
static int c = 20;//静态局部变量
c++;
register int r =30;
r++;
name++;
abc++;
printf("a=%d b=%d c=%d r=%d name=%d abc=%d\n",aa,b,c,r,name,abc);
}
//局部变量在栈上
/* 用户空间
(栈【局部变量】、堆、数据段【全局变量(静态全局,静态局部,动态变量)】、代码段)
*/
//全局变量在数据段存储
/* 数据段包括两部分(静态存储区、动态存储区)
静态存储区
【
全局变量(非静态,静态的全局;静态局部变量)
静态变量(全局和局部2种静态)
data初始化区
bss未出化区
全部变量: auto int a; static int a; 函数内部的局部静态变量static int b;
静态变量就分全局和局部2种;
】
*/
转载于:https://www.cnblogs.com/wanglijun/p/8532694.html
C语言中【变量】的存储类型共有4种类型相关推荐
- c语言格式字符If,C语言所有语句格式 C语言中的的if语句共有多少种格式?
导航:网站首页 > C语言所有语句格式 C语言中的的if语句共有多少种格式? C语言所有语句格式 C语言中的的if语句共有多少种格式? 相关问题: 匿名网友: 1.if语句: if(Bool表达 ...
- 以太坊智能合约开发:Solidity语言中变量的存储位置与作用域
在Solidity中,有一些数据类型是引用类型,如: 数组(string和bytes是特殊的数组,也是引用类型) 结构体(struct) 映射(mapping) 在Solidity中使用引用类型的时候 ...
- 在c语言中 使用变量的要求,关于C语言中变量的探讨
摘 要: 在所有的计算机高级语言中,都存在着变量这样一个重要的概念.变量是计算机高级语言程序的重要成分之一.与其他语言中的变量相比,C语言中的变量所包含的内容更为丰富,包括变量的定义.数据类型.变量数 ...
- c语言中负数的读取和存储,C语言中负数的存储方式
详细介绍负数的文章: https://blog.csdn.net/daiyutage/article/details/8575248 1.以char类型举例,其取值范围是 -128 ~ 127,即-2 ...
- C语言里的4种存储类别,C语言中变量储存的类别
C语言中变量储存的类别 C语言根据变量的生存周期来划分,可以划分为静态存储方式和动态存储方式. C语言中变量储存的类别 静态存储方式:是指在程序的运行期间分配固定的存储空间的方式.静态存储区中存储放了 ...
- c语言中变量的大小,C语言变量定义
C语言变量定义 程序设计就是让计算机按照一定的指令来进行工作,可以说数据的处理是程序设计的主要任务.那么数据是怎么加入到计算机的内存中呢?下面是小编分享的C语言变量定义,欢迎大家阅读!更多相关信息请关 ...
- java语言变量分为_在Java语言中变量分为四种,分别是___________________________________________。_学小易找答案...
[填空题]One day, at the registrar's office of a college, I noticed how parents are behaving with their ...
- C语言中变量的作用域
C语言中变量的作用域 C语言中所有变量都有自己的作用域,申明变量的类型不同,其作用域也不同.C语言中的变量,按照作用域的范围可分为两种, 即局部变量和全局变量. 一.局部变量 局部变量也称为内部变量. ...
- ADS下C语言中局部变量的存储位置分配
ADS下C语言中局部变量的存储位置分配 发布:xlander | 发布时间: 2008年8月12日 做研发很多年了,起初开发的软件都是在台式机上运行的,台式机上丰富的资源从来没让我仔细的思考过有关变量 ...
最新文章
- nslookup域名解析
- Java调用Python遇到的一系列问题与解决方案
- 安装docker和docker-compose
- python 去除多个换行
- 自研DevOps实践
- JSP简单练习-包装类综合应用实例
- boost::signals2模块实现为类定义预析构函数的最小示例的测试程序
- Java 基础-面试题
- 异步 HttpContext.Current实现取值的方法(解决异步Application,Session,Cache...等失效的问题)...
- saltstack的探索-salt指定目标和分组
- 轮播图的效果实现小米商城和京东商城
- 【软件应用】word等office软件中好用的数学公式编辑器插件
- AD快捷键还原为默认配置
- 计算机突然找不到u盘了,win10系统u盘文件突然不见了怎么恢复
- PHP实现微信网页登陆授权开发
- [Python人工智能] 四.神经网络和深度学习入门知识
- Pycharm中如何将界面上的英文换为中文与Pycharm的背景设置与更换
- 【python】详解multiprocessing多进程-Pool进程池模块(二)
- 超50万人推荐的神奇兼实用App,个个精品,打死也不能错过
- 金蝶云苍穹笔记(三)