浅析c语言中的变量(局部变量,外部变量,静态变量,寄存器变量)[转]
c语言中变量分为四类,分别是
1.auto 自动变量
2.static 静态存贮分配变量(又分为内部静态和外部静态)
3.extern 全程变量(用于外部变量说明)
4.register 寄存器变量(分配在硬件寄存器中)
四大类,所有变量必须先说明(定义),后使用。
下面分别介绍
1.自动变量(局部变量)
局部变量:在一个函数开头或段开头处说明的变量,
它有几个特征,,
a、作用域为定义它的函数
b、编译器不会对自动变量给予隐含的初值,故其值不确定,因此每次使用前必须明确的置初值。
c、形参是自动变量,作用域仅限于相应函数内
d、自动变量随函数的引用而存在和消失,由一次调用到下一次调用之间不保持值。
- #include <stdio.h>
- void print_number (int x, int y)
- {
- int m,sum;
- for(m = x;m<y;m++) {
- sum +=m;
- }
- printf("%d\n",sum);
- }
- void main(void)
- {
- print_number(3,5);
- print_number(3,5);
- }
这个程序打印的值均不正确,因为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语言中的变量(局部变量,外部变量,静态变量,寄存器变量)[转]的更多相关文章
- C语言中全局变量、局部变量、静态全局变量、静态局部变量的区别 (转)
1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种: 全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域. 从作用域看: 1>全局变量具有全局 ...
- 浅析C语言中的整形类型
在C语言中,可以把 字符型.短整形.整形.长整形都看作是整形,同属于整形家族这个大类型. 这些类型的大小,默认是否有符号等一些知识点较零散,较容易混淆,所以特地整理如下. 一 类型存储字节长度说明 ...
- 浅析Java语言中两种异常的差别
Java提供了两类主要的异常:runtime exception和checked exception.所有的checked exception是从java.lang.Exception类衍生出来的,而 ...
- C语言中变量的存储类型
在C语言中,对变量的存储类型说明有以下四种: auto 自动变量register 寄存器变量extern 外部变量static 静态变量 自动变量和寄存器变量属于动态存储方式,外部变量和静态变 ...
- C语言中【变量】的存储类型共有4种类型
在C语言中,对变量的存储类型说明有以下四种: auto 自动变量 (动态存储) register 寄存器变量(动态存储) extern 外部变量(静态存储) ...
- JAVA语言中的修饰符
JAVA语言中的修饰符 -----------------------------------------------01--------------------------------------- ...
- arm-linux-gcc编译器定义寄存器变量
uboot代码中有这么一句话“#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("r8")”, ...
- Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数
Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数 7.4.4 为外部参数设置默认值 开发者也可以对外部参数设置默认值.这时,调用的时候,也可以省略参数传递本文选自Swift1 ...
- 对内存分配的理解 自动变量 局部变量 临时变量 外部变量 字符串长度 C语言可以看成由一些列的外部对象构成
Status ListInsert_Sq(SqList *L,int i,LElemType_Sq e) { LElemType_Sq *newbase; LElemType_Sq *p,*q; if ...
随机推荐
- DNS劫持(网页打不开的解决方法)
我们上网,必不可少的就是DNS,在这里先介绍下DNS的相关知识. DNS 是域名系统 (Domain NameSystem) 的缩写,它是由解析器和域名服务器组成的.域名服务器是指保存有该网络中所有主 ...
- log4j打印参数
%m 输出代码中指定的消息 %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %c 输出所属的类目,通 ...
- [收藏]win8安装弹出输入的产品密钥与用于安装任何可用windows映像都不匹配
问题描述: 帮朋友装win8(第一次装大神不要喷我啊)结果到 现在安装 这一步的时候 点击 现在安装 弹出个窗口 说输入的产品密钥与用于安装任何可用windows映像都不匹配.请输入其他产品密钥 解决 ...
- 在安卓3.0以下版本使用Fragment的注意事项
1. 按照网上的Fragment官网资料翻译来做一直有错: 10-03 02:43:13.971: E/AndroidRuntime(1921): java.lang.RuntimeException ...
- 学习笔记--HashMap浅析
HashMap 实现了Map 接口,其底层以一个线性数组保存哈希表,所以它既有数组查询的高效,也有哈希存取的方便. HashMap提供了默认构造器,和有参构造器,在有参构造器中,提供了两个参数,可以对 ...
- sql语句not in判断条件注意事项
sql语句not in判断条件注意事项 问题描述:mysql数据库,存在两个表org表和kdorg表,用于存储组织信息.现在我需要从org表找出组织,条件为该组织不在kdorg表里. sql语句:se ...
- python 循环技巧
原文地址:http://docs.pythontab.com/python/python3.4/datastructures.html#tut-tuples 在字典中循环时,关键字和对应的值可以使用 ...
- 802.11 wireless 二
802.11 wireless 2wireless spectrum(无线频谱)1.无线网络使用RF(射频)信号2.无线电也是电磁波3.频谱基于波长被划分,归为多个类型4.无线网络被归为微波段(mic ...
- Oracle创建表时涉及的参数解析
1.oracle pctfree和pctused详解 http://www.cnblogs.com/linjiqin/archive/2012/01/16/2323320.html http:// ...
- 帝国cms无法注册登录快速解决方法 附路径
帝国cms安装相对比较简单,一路next,一般从网上下载的系统都会带一些数据,恢复备份数据后,清除缓存,更新数据,一个copy版的网站就出来了.但是为了se的友好需要改动很多地方,不然很容易被认为是s ...