c语言中变量分为四类,分别是

1.auto   自动变量

2.static   静态存贮分配变量(又分为内部静态和外部静态)

3.extern  全程变量(用于外部变量说明)

4.register  寄存器变量(分配在硬件寄存器中)

四大类,所有变量必须先说明(定义),后使用。

下面分别介绍

1.自动变量(局部变量)

局部变量:在一个函数开头或段开头处说明的变量,

它有几个特征,,

a、作用域为定义它的函数

b、编译器不会对自动变量给予隐含的初值,故其值不确定,因此每次使用前必须明确的置初值。

c、形参是自动变量,作用域仅限于相应函数内

d、自动变量随函数的引用而存在和消失,由一次调用到下一次调用之间不保持值。

  1. #include <stdio.h>
  2. void print_number (int x, int y)
  3. {
  4. int m,sum;
  5. for(m = x;m<y;m++) {
  6. sum +=m;
  7. }
  8. printf("%d\n",sum);
  9. }
  10. void main(void)
  11. {
  12. print_number(3,5);
  13. print_number(3,5);
  14. }

这个程序打印的值均不正确,因为sum未赋初值,造成了打印的数为随机数。 我们把sum赋初值为0再执行以下,结果就正确了,这个程序说明局部变量必须要先赋初值再使用,另外说明局部变量的生命周期为函数调用时开始,函数调用完成时消亡。

 

2.外部变量:在函数外部定义的变量即为外部变量,它的作用域是整个程序(全程变量)。

 

a.    c程序可以分别放在几个文件上,每个文件可以作为一个编译单位分别进行编译。外部变量只需在某个文件上定义一次,其它文件若要引用此变量时,应用extern加以说明(外部变量定义时不必加extern关键字)。

b.   在同一文件中,若前面的函数要引用后面定义的外部(在函数之外)变量时,在函数里加extern加以说明。

 
引进外部变量的原因:解决函数单独编译的协调;与变量初始化有关;外部变量的值是永久的;解决数据共享;
 
注意:函数本身也被认为是外部变量

 

3.静态变量:分为内部静态变量和外部静态变量

内部静态变量:a.在局部变量前加上static就为内部静态变量

b.静态局部变量仍是局部变量,其作用域仍在定义它的函数范围内,但它采用静态存贮分配(由编译程序在编译时分配,而一般的自动变量和函数形参均采用动态存贮分配,即在运行时分配空间),当函数执行完,返回调用点时,该变量并不撤销,再次调用时,其值将继续存在。

外部静态变量:a.在函数外部定义的变量前加static即为外部静态变量

b.作用域为定义它的文件,即成为该文件的私有变量,其他文件上的函数一律不得直接访问,除非通过它所在文件上的函数进行操作,这可实现数据隐          藏。

4.寄存器变量:只有自动(局部)变量和函数参数才能进一步指定为寄存器存贮类

a.使用register变量可以提高存取速度,但寄存器变量的数目依赖于具体机器,声明多了也只有前几个有效。

b.只限于int,char,short ,unsigned和指针类型用寄存类。

c.不能对register变量取地址(即&操作)

变量的初始化:

外部变量和静态变量由编译程序给予隐含的初始值0;
局部变量的初始化每进入函数便初始化一次。
外部或静态变量仅在编译时初始化一次。
自动变量或寄存器变量只能显示初始化,否则将有不确定的值。
外部数据的说明,如果带有初始化项,则当成一个定义。

 

在c语言中函数不能嵌套定义,但是变量可以嵌套定义。

 

int i = 0;

main( )

{

int i = 1;

printf(“i=%d, ”, i);

{

int i = 2;

printf(“i=%d, ”, i);

{

i += 1;

printf(“i=%d, ”, i);

}

printf(“i=%d, ”, i);

}

printf(“i=%d\n ”, i);

}

 

结果:i=1, i=2, i=3, i=3, i=1

浅析c语言中的变量(局部变量,外部变量,静态变量,寄存器变量)[转]的更多相关文章

  1. C语言中全局变量、局部变量、静态全局变量、静态局部变量的区别 (转)

    1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种: 全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域. 从作用域看: 1>全局变量具有全局 ...

  2. 浅析C语言中的整形类型

    在C语言中,可以把 字符型.短整形.整形.长整形都看作是整形,同属于整形家族这个大类型. 这些类型的大小,默认是否有符号等一些知识点较零散,较容易混淆,所以特地整理如下.   一 类型存储字节长度说明 ...

  3. 浅析Java语言中两种异常的差别

    Java提供了两类主要的异常:runtime exception和checked exception.所有的checked exception是从java.lang.Exception类衍生出来的,而 ...

  4. C语言中变量的存储类型

    在C语言中,对变量的存储类型说明有以下四种: auto 自动变量register   寄存器变量extern 外部变量static   静态变量 自动变量和寄存器变量属于动态存储方式,外部变量和静态变 ...

  5. C语言中【变量】的存储类型共有4种类型

    在C语言中,对变量的存储类型说明有以下四种:   auto          自动变量 (动态存储) register     寄存器变量(动态存储) extern       外部变量(静态存储) ...

  6. JAVA语言中的修饰符

    JAVA语言中的修饰符 -----------------------------------------------01--------------------------------------- ...

  7. arm-linux-gcc编译器定义寄存器变量

    uboot代码中有这么一句话“#define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r8")”, ...

  8. Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数

    Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数 7.4.4  为外部参数设置默认值 开发者也可以对外部参数设置默认值.这时,调用的时候,也可以省略参数传递本文选自Swift1 ...

  9. 对内存分配的理解 自动变量 局部变量 临时变量 外部变量 字符串长度 C语言可以看成由一些列的外部对象构成

    Status ListInsert_Sq(SqList *L,int i,LElemType_Sq e) { LElemType_Sq *newbase; LElemType_Sq *p,*q; if ...

随机推荐

  1. [转]log4net 使用指南

    声明:本文内容主要译自Nauman Leghari的Using log4net,亦加入了个人的一点心得(节3.1.4). 请在这里下载示例代码 1           简介 1.1          ...

  2. NABC的特点分析

    题目:                         请把采用卡片分类的方法讨论你们的团队开发项目特点,再按照 NABC 的框架分析每个特点. 每一个组员针对其中的一个特点将NABC的分析结果发表博 ...

  3. 为什么Linux的fdisk分区时第一块磁盘分区的First Sector是2048?

    这个问题曾经困扰我很久,在了解了MBR之后,我曾认为第一块分区之前为一个block.但是用fdisk查看是2048,一直不了解其中的缘由,今天查了一下资料,大概了解了,其中的细节留着慢慢去了解. 最直 ...

  4. 十个优秀的C语言学习资源推荐

    学习C语言,需要一点一滴,沉下心来,找个安静的地方,泡上一杯咖啡,在浓郁的香味中一起品味她.-- Boatman Yang 人们通常认为计算机编程很烦,但是有些人却从中发现了乐趣.每一个程序员不得不跟 ...

  5. mongodb 操作类

    在使用这个类之前,建议先自己去写,把方法都了解了再用,这样你就可以在适当的时候修个此类,另外请自己构建PagerInfo using System; using System.Collections. ...

  6. ffmpeg 发布hls流

    本来主要讲述如何利用ffmpeg将输入视频流通过转码的方式转成m3u8文件.如何通过http的方法将切边推送给客户端,不在本文中讲述. 输入视频流可以是rtsp流,也可以是http,还可以是文件等等. ...

  7. 关于Office 2013的几个问题

    最近在阅读一些pdf的材料,想对其中做一些批注,但是PDF文档做批准比较麻烦,而且市场上的几个pdfToWord也不是很好用. 偶然的机会发现,使用office2013可以直接打开pdf文件,所以赶紧 ...

  8. 开始学习C++ Templates

    设计模式的学习以及各种设计模式的C++实现已经告一段落了,解释器模式和迭代器模式,以及模版办法简单的看了一下. 画UML图的时候再重点学习 从今天开始学习Templates.

  9. Linux - 常用命令行(一)

    今天和大家分享一些最基本常用命令行:也是作为新手最应该了解掌握的 ls 命令:用来显示指定工作目录下内容 dir命令:与ls命令一致 cd  命令:变化工作目录 pwd命令:显示用户当前的工作路径,显 ...

  10. 创建REST服务应用程序

    Web服务类别有两种,一种是基于SOAP协议的服务,另一种是基于HTTP协议的REST架构风格的服务.REST服务的数据格式有两种:XML 和 JSON,REST服务已被大量应用于移动互联网中. 本文 ...