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. copy-mutableCopy

    copy和mutableCopy语法的目的:改变副本的时候,不会影响到源对象:调用Copy产生的对象是不可变的,调用mutableCopy产生的对象是可变的,与调用对象是否可变无关. Copy 需要先 ...

  2. 软件工程随堂小作业——最优惠价钱(C++)

    一.设计思路 前提,没有买重复书的情况是最优惠的.总共买n本书,可以分解成5k+(n-5k),k=0,1,2,...1.如果k=0,n本不重复的价钱是最优惠的:2.如果k=1,算出每一种情况的折扣并比 ...

  3. OS X 使用技巧——访问所有的键盘功能

    苹果笔记本电脑和苹果的无线键盘只有一个Delete键,可以删除光标前面的字. 按住Fn键再按Delete键就能删除光标后面的字符. 按住Fn键会把上下方向键的效果变成Page Up / Page Do ...

  4. HTML 表格生成

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 【CentOs】配置nginx

    参考资料:http://nginx.org/en/linux_packages.html#stable 1.添加nginx.repo 2.配置nginx 3.启动nginx 1.添加nginx.rep ...

  6. hdu 4193 Non-negative Partial Sums

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4193 题意:给出一个n数列,要求把前i(1<=i<=n)个数移到剩余数列的后面形成新的数列 ...

  7. 【BZOJ】【2049】【SDOI2008】洞穴勘测 Cave

    LCT 哦……LCT的一道更水的裸题,适合学习access,link,cut等基本操作(其实这三个不是在一个层面上的?不要在意这些细节……) /**************************** ...

  8. 最全的dedeCMS标签调用技巧和大全

    1. 页面php方法获取字段  $refObj->Fields['id']; 2. 在页面上使用PHP连接数据库查询 {dede:php} $db = new DedeSql(false); $ ...

  9. 引擎设计跟踪(九.14.2f) 最近更新: OpenGL ES & tools

    之前骨骼动画的IK暂时放一放, 最近在搞GLES的实现. 之前除了GLES没有实现, Android的代码移植已经完毕: [原]跨平台编程注意事项(三): window 到 android 的 移植 ...

  10. .NET设计模式(17):命令模式(Command Pattern)(转)

    概述 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将“行为 ...