C语言中的变量详解

发布者:GoldenSerenity最新更新时间:2015-04-30 来源: 51hei关键字: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语言中的变量详解

上一篇:STC12C5201AD单片机的PWM功能的应用总结
下一篇:手动可调变速的流水灯程序

推荐阅读最新更新时间:2024-03-16 14:00

程序结构理解(2) 以stm32为例
stm32启动流程分析 这个是一个汇编与c语言结合的流程 stm32入口为 startup_stm32f10x_hd.s (即第一个执行的文件) 在这个文件中首先定义定义CSTACK数据段和.intvec代码段还有全局函数和全局变量 然后就是向量表 在然后就是向量表中的定义了各个函数。 同时复位函数作为程序运行的第一个函数 里面设置了时钟和main入口等 就这样进入了main 然后就调用了各个外设资源 流程大致总结如下 大概意思就这样吧
[单片机]
程序结构理解(2) 以stm32为例
单片机系统的C语言程序结构优化
   2002年初,笔者着手写一个IC卡预付费电表的工作程序,该电表使用Philips公司的8位51扩展型单片机 87LPC764 ,要求实现很多功能,包括熄显示、负荷计算与控制、指示闪烁以及电表各种参数的查询等,总之,要使用时间的单元很多。笔者当时使用ASM51完成了这个程序的编写,完成后的程序量是2KB多一点。后来,由于种种原因,这个程序并没有真正使用,只是作了一些改动之后用在一个老化设备上进行计时与负荷计算。约一年后,笔者又重新改写了这些代码。 1 系统的改进   可以说,这个用ASM51实现的代码是没有什么组织性可言的,要什么功能就加入什么功能,弄得程序的结构非常松散,其实这也是导致笔者最终决定重新改写这些代码的
[单片机]
Keil C51对C语言的关键词扩展之九: idata
idata声明的变量存储在内部ram 256字节范围内。 data声明的变量存储在内部ram低128字节范围内。
[单片机]
PTR2000无线收发C语言程序
PTR2000基于SCT89C52单片机的无线收发程序: #include reg52.h //引用标准库的头文件 #include stdio.h #defineucharunsignedchar #defineuintunsignedint #defineREQ_SEND 0x33 #defineREQ_RESEND 0x66 #defineSEND_OVER 0x99 //为简化起见,假设了7位固定的采集数据 #define DATA0 0x10 #define DATA1 0x20 #define DATA2 0x30 #define DATA3 0x40 #define DATA4 0x50 #define DAT
[单片机]
单片机C语言教程-基础语句
  C语言入门之基础语句   从程序流程的角度来看,程序可以分为三种基本结构,即顺序结构、分支结构、循环结构。这三种基本结构可以组成所有的各种复杂程序。c语言提供了多种语句来实现这些程序结构。本文将介绍这些基本语句及其应用,使读者对c程序有一个初步的认识,为以后的学习打下基矗   c程序的语句   c程序的执行部分是由语句组成的。程序的功能也是由执行语句实现的。   c语句可分为以下五类:   1.表达式语句   2.函数调用语句   3.控制语句   4.复合语句   5.空语句   1.表达式语句   表达式语句由表达式加上分号“;”组成。其一般形式为:表达式;执行表达式语句就是计算表达式的值。例如: x=y+z;赋值语句y+
[单片机]
X25045看门狗电路硬件连接图及C语言看门狗程序
采用89C51单片机和X25045组成的看门狗电路,X25045硬件连接图如图2所示。X25045芯片内包含有一个看门狗定时器,可通过软件预置系统的监控时间。在看门狗定时器预置的时间内若没有总线活动,则X25045将从RESET输出一个高电平信号,经过微分电路C2、R3输出一个正脉冲,使CPU复位。图2电路中,CPU的复位信号共有3个:上电复位(C1、R2),人工复位(S、R1、R2)和Watchdog复位(C2、R3),通过或门综合后加到RESET端。C2、R3的时间常数不必太大,有数百微秒即可,因为这时CPU的振荡器已经在工作。 图2 X25045看门狗电路硬件连接图 看门狗定时器的预置时间是通过X25045的状态寄存器的
[单片机]
X25045看门狗电路硬件连接图及<font color='red'>C语言</font>看门狗程序
简析STM32的启动过程
  当前的嵌入式应用程序开发过程里,C语言已成为了绝大部分场合的最佳选择。如此一来main函数似乎成为了理所当然的起点——因为C程序往往从main函数开始执行。但一个经常会被忽略的问题是:微控制器(单片机)上电后,是如何寻找到并执行main函数的呢?很显然微控制器无法从硬件上定位main函数的入口地址,因为使用C语言作为开发语言后,变量/函数的地址便由编译器在编译时自行分配,这样一来main函数的入口地址在微控制器的内部存储空间中不再是绝对不变的。相信读者都可以回答这个问题,答案也许大同小异,但肯定都有个关键词,叫“启动文件”,用英文单词来描述是“Bootloader”。   无论性能高下,结构简繁,价格贵贱,每一种微控制器(
[单片机]
单片机C语言程序-依次点亮八个LED灯
电路很简单八个led灯接在p1口.运行后看到的效果是 从第一个灯开始 随着时间变化 二进制数的递减 所有的灯都会依次的点亮,当全部的灯都被点亮后再重新开始这个过程 一直循环下去 单片机是不是很有趣? 下面是c语言程序源码 #include reg51.h void delay100ms(); //如果函数是在主函数后面定义,那么一定要在主函数前面声明 void main() { int i; i=0xfe; while(1) {P1=i; i--; delay100ms(); if(i==0) i=0xfe; } } void delay100ms(vo
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved