c语言中常见的变量,C语言中的变量详解
先说说变量的作用域,比如,在函数中,形参变量只是在被调用期间才分配内存单元,调用结束立即释放。这就说明形参变量只有在函授内才是有效的,离开该函数就不能再使用了。
这种变量有效性的范围称为变量的作用域。当然不仅仅是形参变量,在C中所有的量都有自己的作用域。
C中的变量,按作用域可分为两种,局部变量和全局变量。
局部变量:
也称内部变量。局部变量是在函数内做定义说明的,其作用域仅限于函数内部,离开函数后再使用这种变量是非法的。
如: void delay(unsigned int x)
{ unsigned char i,j; //i j 的作用域只是在delay函数内
}
关于局部变量的作用域的几点说明:
1、主函数中定义的变量也只能在主函数中使用,不能在其他函数中使用。同时,主函数中也不能使用其他函数中定义的变量。因为主函数也是一个函数,它与其他函数是平行关系。
2、形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。
3、允许在不同函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。
4、在复合语句中也可以定义变量,其作用域只是在复合语句范围内。
比如: main( void)
{
Int s,a;
……
{
Int b;
s=a+b;
…… //b的作用域
}
…… //s,a的作用域
}
全局变量
也称外部变量,在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般要作全局变量说明。只有在函数内经过说明的全局变量才能使用。全局变量的说明符extern。但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。
如: int a,b; // 外部变量 a,b
Void f1( )
{
……
}
Float x,y;//外部变量 x,y
Int f2( )
{
……
}
Main( )
{
……
}
在上例中,a b x y都是在函数外部定义的外部变量,都是全局变量,但是x y定义在F1函数之后,在F1中又无对x y的说明,所以x y在F1函数中是无效的,a b 定义在源程序的最前面,因此在F1 F2及main函数中即使不加以说明仍然可以使用。这也是在单片机编程中把全局变量写在程序函数之前的原因。
如果同一个源文件中,外部变量与局部变量同名,则局部变量的作用范围内,外部变量被“屏蔽”即不起作用。
用extern声明外部变量
外部变量是在函数的外部定义的变量,其作用域是从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件的结尾。如果在定义点之前的函数想引用该外部变量,则应在引用之前用关键字extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。
#include
unsigned int a,b;
void sumab()
{
unsigned int s1,s2 ;
extern unsigned int x,y;
s1=a+b;
s2=x+y;
}
void main()
{
sumab();
while(1);
}
unsigned int x=3,y=4;
程序的最后1行定义了外部变量x,y,但由于外部变量定义的位置在函数main之后,本来是在main中不能引用外部变量x,y。当在main函数中用extern对x,y进行了“外部变量声明”,就可以从“声明”处起,合理的使用该外部变量x和y。
变量的存储类别
动态存储方式和静态存储方式
变量从作用域(空间)上分为全局变量和局部变量。
从存在的时间(生存期)的角度可分为静态存储方式和动态存储方式。
静态存储方式:在程序运行期间分配固定的存储空间的方式。
动态存储方式:在程序运行期间根据需要进行动态的分配存储空间的方式。
用户存储空间可以分为三个部分:
1、程序区
2、静态存储区
3、动态存储区
全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放,在程序执行的过程中它们占据固定的存储单元,而不动态的进行分配和释放。
动态存储区存放如下的数据:
1、函数形式参数
2、自动变量(未加static声明的局部变量)
3、函数调用的现场保护和返回地址;
对于上面的数据,在函数开始调用时分配动态存储空间,函数结束时释放这些空间。
在C中,每个变量和函数有两个属性:数据类型和数据的存储类别。
Auto变量
局部变量,如不专门声明是static存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。自动变量用关键字auto作为存储类别的声明。也可以隐含不写,系统默认是auto.
static声明局部变量
加入希望函数中的局部变量的值在函数调用后不消失而是保留原值,这时可以将局部变量用static进行声明,变为“静态局部变量”。
对静态局部变量的说明:
1、静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序运行期间都不释放。
2、静态局部变量在编译时赋初值,即只赋初值一次;而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
3、如果在定义局部变量时不赋初值的话,对静态局部变量来说,编译时自动赋初值0或空字符。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。
Register变量
为了提高效率,C允许将局部变量的值放在CPU中的寄存器中,这种变量就叫寄存器变量,用关键字register声明。
说明:
1、只有局部变量和形式参数可以作为寄存器变量
2、一个计算机系统中的寄存器数目是有限的,不能定义任意多个寄存器变量。
3、局部静态变量不能被定义成寄存器变量。
c语言中常见的变量,C语言中的变量详解相关推荐
- Python中常见的__init__.py是什么意思?详解Python import的方式和原理
Python中常见的__init__.py是什么意思?详解Python import的方式和原理 1 什么是模块化编程? 2 __init__.py文件的作用 3 Python如何import第三方库 ...
- c语言初学者常见错误归纳,C语言中常见错误分析.doc
C语言中常见错误分析 摘要:C语言是许多高校开设的第一门程序设计语言,使用方便灵活.根据C语言的特点,并结合实际教学,对在编程中经常遇到的错误进行分析.总结,为初学者尽快掌握C语言,提高程序设计水平提 ...
- 机器学习中常见的损失函数_机器学习中最常见的损失函数
机器学习中常见的损失函数 现实世界中的DS (DS IN THE REAL WORLD) In mathematical optimization and decision theory, a los ...
- 编程题50 习题6-8 单词首字母大写【浙大版《C语言程序设计(第4版)》题目集 详解教程】
编程题50 习题6-8 单词首字母大写[浙大版<C语言程序设计(第4版)>题目集 详解教程] 原题链接:习题6-8 单词首字母大写 (pintia.cn) 参考答案 #include< ...
- php中单引号,php中的单引号、双引号和转义字符详解
PHP单引号及双引号均可以修饰字符串类型的数据,如果修饰的字符串中含有变量(例$name):最大的区别是: 双引号会替换变量的值,而单引号会把它当做字符串输出. 例如: 结果: 字符串$name 字符 ...
- linux mv复制命令,linux中删除复制移动文件rm,mv,cp命令详解linux操作系统 -电脑资料...
在linux中对文件的复制删除移动分别会使用到rm,mv,cp三个命令,下面我来给大家介绍一下rm,mv,cp命令对文件的常规操作吧, 先看实例 删除复制移动文件命令 Linux代码 rm -rf / ...
- [ASP.NET]ASP.NET中的Inherits、CodeFile、CodeBehind的区别详解及OWIN及IDENTITY
篇一 : ASP.NET中的Inherits.CodeFile.CodeBehind的区别详解 Inherits.CodeFile.CodeBehind 在 ASP.NET 中使用代码隐藏方法来设计W ...
- python导入模块的变量_python 环境变量和import模块导入方法(详解)
1.定义 模块:本质就是.py结尾的文件(逻辑上组织python代码)模块的本质就是实现一个功能 文件名就是模块名称 包: 一个有__init__.py的文件夹:用来存放模块文件 2.导入模块 for ...
- 【Linux】19.Linux环境变量名LD_LIBRARY_PATH 和 ldd命令详解
Linux环境变量名LD_LIBRARY_PATH 和 ldd命令详解 参考链接: https://www.jianshu.com/p/a62e1d327023 LD_LIBRARY_PATH中的LD ...
- 合法的python变量名import_python 环境变量和import模块导入方法(详解)
1.定义 模块:本质就是.py结尾的文件(逻辑上组织python代码)模块的本质就是实现一个功能 文件名就是模块名称 包: 一个有__init__.py的文件夹:用来存放模块文件 2.导入模块 imp ...
最新文章
- C#种死锁:事务(进程 ID 112)与另一个进程被死锁在 锁
- 24款非常实用的CSS3工具终极收藏
- jquery正则表达式验证:验证全是数字
- C语言过时了吗?不,我们需要的是一份个人成长
- dropify,不错的图片上传预览插件
- 常见音视频格式(转载)
- java list 取几个字段组装成map_java.util.concurrent 并发包诸类概览
- php下xmlwriter,PHP实现基于XMLWriter操作xml的方法
- Java中this关键词与构造函数,构造代码块的理解
- 自定义 Behavior - 仿新浪微博发现页的实现
- 24个可能你现在用不到,但应该了解的 PHP 库
- python绘制菱形_用python画菱形
- 平安科技美国研究院院长韩玫:AI赋能传统行业,要知其然也知其所以然
- 解决本地请求跨域问题,替换代理,Whistle + chrome扩展工具SwitchyOmega
- 变分推断(Variational Inference)解析
- 例25:求1+2!+3!+...+20!的和。
- 爆笑!史上最强的中国式英语
- 第一章 开启网络安全态势感知的旅程
- 电商生鲜网站开发(四)——后台开发:商品模块-图片上传/多条件拼接sql
- Ubuntu系统备份到U盘
热门文章
- 从flink-example分析flink组件(3)WordCount 流式实战及源码分析
- 金融风控实战——生肖属性单变量分析
- 【联邦学习】FATE 集群部署 step1
- 研究38位知名CEO的邮件后,我们有这9个发现
- 直击CVPR2017:商汤科技打造技术盛宴23篇论文刮起中国风 By 机器之心2017年7月25日 10:14 近日,CVPR2017 在夏威夷如火如荼地进行,作为全球计算机视觉顶级会议,CVPR
- 模拟上帝之手的对抗博弈——GAN背后的数学原理
- 服务器08系统伪静态,win2003/2008服务器IIS站点安装设置伪静态的方法
- idea自动更新java_IntelliJ IDEA自动更新资源文件
- 实战并发编程 - 05等效不可变对象CopyOnWriteArrayList适用场景剖析_写时复制COW
- 深入理解分布式技术 - 先更新数据库,还是先更新缓存