变量的作用域与存储类别&&变量的生存期——天擎国际
C语言程序设计(第2版)2-4 变量定义

变量名表由一个或多个变 量组成,两个变量之间用 逗号分隔,变量名必须是 C语言合法标识符。
说明:变量定义后,在编译或在程序运行时系统将为变量分配相应 字节的存储空间,分配的存储空间的大小与变量所定义的类型有关。
04
变量定义举例
int i,j,k; 说明: 缺省存储类别标识符,系统默认是 auto, 定义了3个变量i,j,k都是基本整型 变量、都是自动变量,在程序运行 期间为这三个变量分配存储空间。
03
变量的定义 变量定义的一般格式如下:其中方括号的内容表示是可选的。 [类别标识符]
类别标识符用来说明变 量名表中变量的存储类 别,存储类别标识符包 括:auto(自动)、 register(寄存器)、 static(静态)。
类型标识符
变量名表;
举例: int
x,y,z;
类型标识符用来说明变量名表中变 量的数据类型,类型标识符包括: short(短整型)、int(基本整 型)、long(长整型)、float (单精度实型)、double(双精 度实型)、char(字符型)等。
变量定义
变量
变量是在程序运行过程中,其值可以改变的量。 C语言规定:程序中所使用的每一个变量在使用之前都要进行类 型定义,即“先定义,后使用”。
02
C语言中变量的两种属性
操作属性: 操作属性由数据类型来决定,它规定了变量的存储空间的大小(即存储 长度)、取值范围和所允许的操作。 存储属性: 变量的存储属性由存储类别什么;何时为其分配存储空间、何时释放它的存储 空间,即变量的生存周期;变量起作用的范围有多大,即变量的作用域。
static double a,b; 说明: 定义了2个变量a,b都是双精度实型 变量、都是静态变量,在编译时就为 这两个变量分配存储空间。
变量的“存在性”与“可见性”new

变量的“存在性”与“可见性”.一、变量的作用域与存储类型一个C程序(*.EXE)由若干个C文件(*.C)组成,一个(*.C)文件由若干个C函数组成。
函数内、外均可(根据需要)定义或声明变量。
【按作用域划分】内部变量、外部变量内部变量:在函数内定义变量称为内部变量(局部);外部变量:在函数外定义变量称为外部变量(全局);二者区别:定义出现的位置。
【按存储类型划分】auto、static/register(动态、静态/寄存器变量)变量定义一般格式:[存储类型] 数据类型变量表auto:动态:([存储类型]缺省时,系统默认为动态;)位置:动态区特点:程序运行时动态分配,每次调用时都重新赋初值,调用不赋初值时,其值不确定。
static:静态:位置:静态区特点:程序编译时静态分配,每次调用时不再重新赋初值,保留最后一次调用的值。
二者区别:存储位置不同,register:寄存器:位置:在CPU内;特点:速度快;补充说明:一般不用认为进行存储类型声明,系统编译时,根据需要自动声明register类型)【可见性/作用域(屏蔽/扩展)说明/声明】static/extern程序使用内存存储空间分布:二、Static:用于变量和函数时的不同意义1.Static:用于变量时,共性是:静态存储(1)用于外部变量:代表是本*。
C文件内私有变量,且静态存储其他*。
C(即使用extern声明也)不能调用(2)用于内部变量:代表是本函数内私有变量,且静态存储2. Static:用于函数时,代表是本*。
C文件私有函数,其他*。
C(即使用extern声明也)不能调用Static:静态的:用于外部变量或函数时,代表作用域用于内部变量时,代表生存期三、变量的“存在性”与“可见性”(简表)四、函数的形参与实参之间的数据传递1. 数据传递方向是单向的:实向形;2.被调用函数的内可有多个retun (可供条件选择),但返回值只有一个。
Return(表达式)中的返回值以函数类型不一致时,返回值以函数类型为准。
变量的作用域及存储类别

一、变量的作用域 二、复合语句 三、变量的存储类别
一、变量的作用域
作用域:局部变量和全局变量 局部变量:作用范围有限,定义在函数体 内,函数调用时,局部变量才临 时被创建,函数执行完后,局部 变量自动被释放。 函数体内定义变量。 形参。 复合语句定义的变量。
全局变量:在函数体外部定义的变量。 作用范围:从定义位置开始到源程序结 束,定义在整个程序空间 内,在开始运行程序时被创 建,整个程序执行完后才被 释放。
例:交换两个变量的值。 #include”stdio.h” int x,y; //全局变量 int swap( ) { int t; t=x; x=y; y=t; } main( ) { scanf(“x=%d,y=%d”,&x,&y); swap( ); printf(“x=%d,y=%d\n”,x,y); }
#include”stdio.h” int fun( ) { static int x=1; x*=2; return x; } main( ) { int i,s=1; for(i=1;i<=3;i++) s=s*fun( ); printf(“s=%d\n”,s); } 输出结果:64
i=1 s=s*fun=1*2=2; x=2; i=2 s=s*fun=2*4=8; x=4; i=3 s=s*fun=8*8=64; x=8;
二、复合语句:
概念:把多个语句用花括号{}括起来组成一个语句 称为复合语句。 #include”stdio.h” main( ) { int i=2,j=3,k; k=i+j; { int k=8; printf(“%d\n”,k); } printf(“%d\n”,k); }
第18讲 局部变量 全局变量和存储分类 局部变量作用域和生存期

局部变量 全局变量和存储分类 局部变量及其作用域和生存期
第八章 用户标识符的作用域和存储类
8.1 局部变量,全局变量和存储分类
1. 用户标识符的作用域 作用域 在C语言中,由用户命名的标识符都有一个有 效的作用域.所谓"作用域"是指程序中的某一 部分,只有在这一部分中,该标识符才是有定义 的,即只有在这个域中才能使用该标识符. 例如,在某一函数内定义的变量,只能在该 函数内进行使用.显然,变量的作用域与其定义 语句在程序中出现的位置有直接的关系.由此可 以划分为局部变量和全局变量.
2. 局部变量 例 不同函数中同名变量 例 复合语句中变量
Ch7_103.c Ch7_102.c
局部变量 float f1(int a) 5 #define N { main() int b,c; 定义:在函数内定义,只在本函数内有效 main() a,b,c有效 a,b; { int{ …….i; 说明: } int a=3; int a[N]={1,2,3,4,5}; b=4; ①在main函数中定义的变量只能在main函数中有效 printf("main:a=%d,b=%d\n",a,b); char f2(int x,int y) for(i=0;i<N/2;i++) ②不同函数中的同名变量,占不同的内存单元 sub(); i,j; temp; { { int int x,y,i,j有效 printf("main:a=%d,b=%d\n",a,b); ③函数的形参属于局部变量 …… temp=a[i]; } } ④可以定义只在某个复合语句中有效的变量 a[i]=a[N-i-1]; sub() main() a[N-i-1]=temp; { int a,b;m,n; { int } m,n有效 a=6;……. b=7; for(i=0;i<N;i++) } printf("sub:a=%d,b=%d\n",a,b); printf("%d ",a[i]); } }
c语言中什么是变量

c语言中什么是变量c语言中什么是变量大家在初学C语言的时候对各种变量之间的区别以及存储布局可能都有很多疑问,造成在使用变量的时候可能会遇到错误的地方。
下面是应届毕业生店铺为大家整理的关于c语言的介绍和分类,希望可以帮到大家哦。
c语言中什么是变量篇1c语言的变量特性:第一、变量定义要选择恰到好处的类型,变量的类型直接决定了它所存储的数据取值范围,这类似于我们生活中使用的各种容器,选择合适的变量类型,不但能保证数据存储安全,还能有效的节约系统资源;第二、变量的作用范围必须清楚,C语言最基本的功能单元是函数,在函数内部使用的变量是私有变量,只能在函数内部使用。
多个函数组成一个程序的功能模块,并安置在某一个C文件中,在这些函数的头部定义的变量是静态变量(局部变量),这种类型的变量模块内部的函数都可以访问。
如果在模块内部声明变量,并在该模块的头文件中导出,该类型变量就是全局变量,全局变量在整个工程中的所有函数都可以访问;第三、变量占用的RAM资源,私有变量是可以释放的,静态变量与全局变量是不可以释放的。
也就是说在程序运行的整个过程中,私有变量占用资源可以供不同的函数重复利用,而静态变量与全局变量是完全被占用不能重复利用的;第四、变量可以存放常数,但因为单片机RAM资源有限,强烈建议不要用变量存放常量,而是在资源相对丰富的Flash ROM中存放常量;第五、局部变量与全局变量对于函数来说,访问非常方便,但缺点显而易见:访问的函数越多,数据的安全性越低,一旦出现数据异常,很难排除问题。
所以,请尽量减少局部变量与全局变量的使用;第六、函数的型参个数尽量减少,这样型参只会占用通用寄存器组来完成参数传递工作。
如果参数过多,编译器可能会被迫分配占用RAM资源,这样不但参数传递效率变低,同时还会导致RAM资源浪费;c语言变量的分类全局变量的作用范围是整个程序(如果程序是多个文件,必须在其他的文件中说明)。
静态变量的作用范围要看静态变量的位置,如果在函数里,则作用范围就是这个函数。
C语言程序设计-第5章--函数

实参可以是常量、变量或表达式,但要求 它们必须要有确定的值,在调用时将实参 的值赋给形参。另外,实参和形参的类型 应相同或兼容。
— 31 —
5.2 函数的参数传递和返回值
➢ 5.2.2 函数的返回值
一般情况下,主调函数调用完被调函数后,都希望能够得到一 个确定的值,这就是函数的返回值。在C语言中,函数返回值 是通过return语句来实现的。return语句的一般形式有3种:
/*函数声明*/
/*调用逆序函数,将a的逆序值赋给b*/ /*调用逆序函数,将b的逆序值赋给c */
— 23 —
5.2 函数的参数传递和返回值
➢ 5.2.1 函数的形参与实参
{
int y=0,sign=1;
/*定义sign表示x的符号,定义变量y代表逆序数据*/
if(x<0)
/*当x小于0时取符号及取反*/
— 18 —
5.1 函数的定义和调用
➢ 5.1.2 函数的调用
另外,按函数在语句中的作用来分,可以有以下3种函数调用方式:
函数表达式
函数语句
函数作为实参
函数作为表达式中的一项出 现,以函数返回值参与表达 式的运算。
函数调用的一般形式加上分 号即构成函数语句。
函数作为另一个函数调用的 实际参数出现,即把该函数 的返回值作为实参进行传送。
#include<stdio.h> int main() {
int x=0,y; y=trans(x); printf("y=%d\n",y); printf("x=%d\n",x); return 0; } trans(int a) { a++; printf("a=%d\n", a); return a; }
c语言中变量的存储类别

一.C语言中,从变量的作用域角度来分,可以分为全局变量和局部变量。
二.变量值存在的时间角度来分,可以分为静态存储方式和动态存储方式。
所谓静态存储方式是指在程序运行期间有系统分配固定的存储空间的方式。
而动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。
具体包含4种:自动的(auto),静态的(static),寄存器的(register),外部的(extern)。
1. 自动的(auto)在调用函数时系统会给他们分配存储空间,在函数调用结束时就自动释放这些存储空间,这类局部变量称为自动变量。
2. 静态的(static)为了满足局部变量的值在函数调用结束后不消失而且保留原值,既占用的存储单元不释放,就出现了静态的局部变量,用static来声明的局部变量。
局部变量的特点:(1)相对自动变量(即动态局部变量),在程序的运行期间都占用静态存储区,直到程序结束才释放该存储区。
(2)静态局部变量只是在程序编译时赋初值,以后每次调用时不再重新赋初值,而只是保留上次函数调用结束时的值。
动态局部变量编译时不赋初值,直到程序调用时才给变量赋值,每次调用都要赋初值。
(3)在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时会自动赋初值0或空字符。
而对动态局部变量,不赋初值则它的值是一个不确定的值,因为动态变量每次都要自动分配存储空间,存储空间的值是不固定的。
(4)静态局部变量在函数调用结束后不释放,但其他函数是不能调用的。
3.寄存器的(register)为了提高程序的执行效率,对一些运算频繁的变量定义为寄存器变量可以节省每次程序执行时的内存读取,大大节省了时间,提高了效率。
寄存器的一些特点:(1)寄存器变量的特点程序运行时分配寄存器存储空间,结束时释放。
这个特点限定了只能把局部自动变量和形式参数定义为寄存器变量。
(2)局部静态变量不能定义为寄存器变量。
4. 外部的(extern)外部变量是在函数的外部定义的全局变量,他的作用是从变量的定义初开始,到本程序文件的末尾。
局部变量、全局变量、静态变量的含义及存储位置

局部变量、全局变量、静态变量的含义及存储位置1.局部变量在⼀个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使⽤它们,在此函数以外时不能使⽤这些变量的,它们称为局部变量。
局部变量保存在动态数据区的栈中,只有在所在函数被调⽤时才动态地为变量分配存储单元。
1).主函数main中定义的变量也只在主函数中有效.2).不同函数中可以使⽤名字相同的变量,它们代表不同的对象,互不⼲扰.3).形参也是局部变量.4).在复合语句中定义的局部变量,这些变量只在本复合语句中有效.2.全局变量在函数外定义的变量是外部变量,外部变量是全局变量,全局变量可以为本⽂件中其它函数所共⽤,它的有效范围从定义变量的位置开始到本源⽂件结束。
全局变量位于静态数据区中。
1).设全局变量的作⽤:增加了函数间数据联系的渠道.2).建议不再必要的时候不要使⽤全局变量,因为a.全局变量在程序的全部执⾏过程中都占⽤存储单元.b.它使函数的通⽤性降低了3).如果外部变量在⽂件开头定义,则在整个⽂件范围内都可以使⽤该外部变量,如果不再⽂件开头定义,按上⾯规定作⽤范围只限于定义点到⽂件终了.如果在定义点之前的函数想引⽤该外部变量,则应该在该函数中⽤关键字extern作外部变量说明.4).如果在同⼀个源⽂件中,外部变量与局部变量同名,则在局部变量的作⽤范围内,外部变量不起作⽤.3.静态变量静态变量并不是说其就不能改变值,不能改变值的量叫常量。
其拥有的值是可变的,⽽且它会保持最新的值。
说其静态,是因为它不会随着函数的调⽤和退出⽽发⽣变化。
即static局部变量只被初始化⼀次,下⼀次依据上⼀次结果值;静态变量的作⽤范围要看静态变量的位置,如果在函数⾥,则作⽤范围就是这个函数。
静态变量属于静态存储⽅式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运⾏期间⼀直占⽤这些存储空间(在程序整个运⾏期间都不释放),也可以认为是其内存地址不变,直到整个程序运⾏结束(相反,⽽auto⾃动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调⽤结束后即释放)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
变量的作用域与存储类别(变量的作用域——变量的生存期)
变量的作用域
——局部变量和全局变量
变量的生存期
——静态存储类别和动态存储类别(注意区别存储类型和函数类型)
变量的作用域
一、局部变量
定义:在一个函数内部定义的变量是内部变量,它只在本函数范围内有效。
二、全局变量
定义:在函数之外定义的变量称为外部变量,或全局变量。
它可为本文件中其他函数所共用。
有效范围为从定义变量的位置开始到本源文件结束。
注意:
全局变量在程序的全部执行过程中都占有存储单元,而不是仅在需要时才开辟单元。
它使函数的通用性降低,因函数在执行时要依赖于其所在的外部变量。
降低了程序的清晰性。
在同名局部变量作用的范围内,外部变量被“屏蔽”。
变量的生存期
一、动态存储方式与静态存储方式
静态存储:在程序运行期间分配固定的存储空间的方式。
动态存储:在程序运行期间根据需要进行动态的分配存储空间的方式。
静态存储区:存储空间的分配在编译阶段进行,且存于其中的数据对象相对于程序的执行是永久的。
动态存储区:存储空间的分配是在程序的运行过程中进行的。
二、auto变量
调用函数时系统自动分配存储空间,在函数调用结束时自动释放这些存储空间,称这类局部变量为自动变量。
用关键字auto作存储类别的声明。
它也可省。
三、用static声明局部变量
静态的
局部的
说明:
静态局部变量属于静态存储类别,在静态存储区内分配单元。
在程序整个运行期都不释放。
自动变量属于动态存储类别,在动态存储区内分配单元,函数调用结束后即释放。
静态局部变量在编译时赋初值,以后每次函数调用时不再重新赋初值
...
.......而只是保留上次函
数调用结束时
......的值。
自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值。
静态局部变量,如不赋初值,编译时自动赋初值0 或空字符。
自动变量,如不赋初值,它的值是一个不确定的值。
虽然静态局部变量在函数调用结束后仍然存在,但其他函数不能引用。
一般在下列情况时,使用局部静态变量:
1、需要保留函数上一次调用结束时的值时;
2、如果初始化后,变量只被引用而不改变其值时。
四、register变量
说明:
1、只有局部自动变量和形参可作为register变量。
2、不能定义任意多个寄存器变量。
3、局部静态变量不能定义为寄存器变量。
五、用extern声明外部变量
在一个文件内声明外部变量
例:main( )
{ extern A; /*外部变量声明*/
printf(“%d”,A);
}
……
int A=13; /*定义外部变量*/ ……。