C语言课件 变量的存储属性
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
extern char c1,c2; …….
扩扩 展展 后后 c1,c2 c1,c2
的的 作作 用用 范范 围围
} int f3() {….. } char c1,c2; char f2(int x,int y) { int i,j;
…… } main()
p,q的作用范围 c1,c2的作用范围
{ int m,n;
…….
}
若外部变量与局部变量同名,则外部变量被屏蔽
外部in变t 量a=的1, 使b=用2; 增加了函数/之*外间部传变递量数a据,的b*途/ 径。若一 个用函外in数部t f需变1(要量int返传a回 递) 两数个据或。两个以上的计算结果时,可以使 { int b=10; printf (“%d %d\n”,a,b); return (a* b); /*a,b是f1的内部变量*/ } main( ) { printf(“%d %d\n”,a,b); /*a,b是外部变量*/ printf(“%d\n”,f1(a+b)); /*a,b是外部变量*/ }
§8.1 变量的存储属性
概述
回顾:
• 一个C程序由一个或多个源程序文件组成,一个源程序文件由
一个或多个函数组成。
• C程序以源程序文件为单位进行编译,而不是以函数为单位进
行编译。一个源程序文件可以为多个C程序共用。
程序区
变量的属性
数据类型:
静态存储区
存储属性 存储器类型:寄存器、内存
变量定义格式: [存储类型]
数据类型
变量表;
如: int sum; auto int a,b,c; register int i; static float x,y;
局部变量与全局变量 …#…define N 5
局部变量---内部变量 mamina… f(lion)…a(t) f1(int a) 定义:在函数(或复合语句内{)定{in义{itn,aitn,it其b;b;,作c;用域是本函a数,b,(c或有复效合语句)
格式: #undef 宏名{ …#d…efi.n. e LENGTH (WIYDETSH原+4作0用) 域
宏展开:预编译时,用}宏va体r=替LE换NG宏TH名*2-;--不作语法检查
{ int a[MAX],i, max=5; for(i=0;i<max;i++) a[i]=i;
} sub1() { for(i=0;i< MAX ;i++) a[i]=i+i; } sub3(int a[ ]) { int i;
for(i=0; i<MAX; i++) printf(“%d”, a[i]) ; printf(“\n”); } main() { sub1(); sub3(a); sub2(); sub3(a); }
全局变量---外部变量
定义:在函数外定义
外部变量可用存储类型:缺省 或 static
• static:只能在定义它的文件内使用
• 缺省: 可在其它文件中使用
外部变量说明: extern 数据类型 变量表;
• 同一个文件中,在定义位置之前使用时
int max(in•t 当x,使in用t 其y)它文件中定义的e外xt部er变n i量nt时a(,b;不能是用static定义
auto(自动)变量
C系统默认内部变量的存储类型是auto类型。也可以显式使 用关键字auto来定义局部变量。
自动变量在其定义的函数(或复合语句)开始执行时才分 配内存空间,在该函数(或复合语句)执行期间占用内存 空间,在函数(或复合语句)执行结束时自动变量占用的 空间被系统释放。
若不对自动变量显式地赋初值,则它是一个不确定的值。
例 引用其它文件中的外部变量
int global; extern float x; main() { int local;
. . . }
file1.c
extern int global; static int number; func2() {.
. . }
file2.c
float x; static int number; func3() { extern int global;
不复同合函语数句中中的的同 变名 量变量{ ,api占=rn}fm{io6tn有p…ar;aiti(nrfn,不ii…tb(=(nb"m);同0ts.=f,u;n(7i内b";<;%:N存a=d;单i%+msm"元u+d,aaba),ii,:[bnnai::=m=]因aa)6==%,;n,此33b有d,,=bb不\7==效n44会",a相,b互);影响 }}}
static(静态)变量
static变量存放在内存的静态存储区,在整个程序运行
期间占用固定的内存单元。 系统在编译时为static变量分配空间并赋初值,对未赋
值的内部static数值型变量,系统自动给它赋值为0; 对未赋值的内部static字符型变量,自动赋值为空字符。 因为在编译期时赋初值,所以只能赋一次初值且只能在 定义时进行。 再次调用static内部变量时,static内部变量的值为上 次调用结束时的值。 注意:static内部变量的作用域仍然是定义该变量的函 数体(或复合语句)内部。 对函数形参不能使用static。 不在必要时不要使用局部static变量.
运行结果:1 2 3
例 变量的寿命与可见性 -------Main------
i:1 a:0 b:-10 c:0 全局i
4371 3 5
#include <stdio.h> int i=1;
------Other------
main: a other: a
0 462
i:33 a:4 b:0 c:15 other: b
main:c 80
动态 存储区
printf("i:%d a:%d \ b:%d c:%d\n",i,a,b,c);
other()
register b:-10
{ static int a=2;
c=c+8;
static int b;
other();
int c=10;
printf("-----MAIN------\n"); a=a+2; i=i+32; c=c+5;
. . . }
file3.c
§8.3 内部函数和外部函数
外部函数
外部函数定义格式如下: extern 数据类型 函数名(形式参数表列) { 声明部分; 执行部分;
} 函数声明的格式为:
extern 数据类型 函数名(形式参数表列); 说明: • 外部函数既可被同一文件中函数调用,也可被其他 文件中的函数所调用 • 外部函数的定义和声明都可以省略关键字extern
说明:
a=i3n;…t ab…[=N.4];={1,2,3,4,5};
形参属于局部变量 prf}ionrt(fi(="0m;ia<inN:a/2=;%i+d+,)b=%d\n",a,b);
局ma部in中变定量义可的用变存量储只类在型m:spauari{c{unibhnt中(oat)i、rfn有;(ft"i2itnr效m(,eejitg;mn,atitesipxnt不me=,:iranp能a、=t[;yi因%])s;t为dat,ixb在c,=,ym,%ia,默ji有dn认\函n效"为数,aa中,ubt)定o; 义 就定义在的整变个量文。件或程序中}su有b效(})。…m…aai[[Nin]函=-ia数-[1N也]运=-不it行-e1m能结];p使果; 用:其它函数中
increment(); increment(); increment(); } void increment(void) { int x=0; x++; printf(“%d\n”,x); }
运行结果:1 1 1
main() { void increment(void);
increment(); increment(); increment(); } void increment(void) { static int x=0; x++; printf(“%d\n”,x); }
#define #include #if--#else--#endif等
格式:
“#”开头 占单独书写行 语句尾不加分号
§8.4.1 宏定义
不带参数宏定义
一般形式: #define 宏名 [宏体]
功能:用指定标识符(宏名)代替字符序列(宏体)
宏一般名用中大不写允字许母有。空格,而例且#必de须fin遵e循WC变ID量TH命名80规则。宏名
640
静态 存储区
main()
-------Main-----
{ static int a;
i:33 a:0 b:-10 c:8
register int b=-10;
-------Other-------
int c=0;
i:75 a:6 b:4 c:15 other: c
150
printf("-----MAIN------\n");
printf("i:%d a:%d \
printf("-----OTHER------\n");
b:%d c:%d\n",i,a,b,c); printf("i:%d a:%d \
i=i+10;
b:%d c:%d\n",i,a,b,c);
other();
b=a;
}
}
例:以下程序的运行结果是:
#define MAX 6 int a[MAX], i; sub2()
存储方式
动态百度文库
存储区 动态区 寄存器
生存期 函数调用开始至结束
静态 静态存储区 程序整个运行期间
作用域 定义变量的函数或复合语句内 本文件 其它文件
赋初值 每次函数调用时
未赋初值
不确定
编译时赋初值,只赋一次 自动赋初值0或空字符
例 局部静态变量值具有可继承性
main() { void increment(void);
动态变量与静态变量
存储方式
静态存储:程序运行期间分配固定存储空间 动态存储:程序运行期间根据需要动态分配存储空间
内存用户区
生存期
静态变量:从程序开始执行到程序结束 动态变量:从包含该变量定义的函数开始执行至函数执行结束
变量存储类型
局部变量
外部变量
存储类别 auto register 局部static 外部static 外部
{ int z; 的外部变量)
int max()
z=x>y外?x部:y变; 量定义与外部变量声明{不in同t z;
return(z);
z=a>b?a:b;
}
return(z);
main()
定义
} 说明
{次e数xt:ern int a,只b; 能1次
mai可n()说明多次
位p置rin:tf("max=所%有d"函,m数ax之(a外,b)); { p函rin数tf(内"m或ax函=%数d外",max());
}分配内存: 分配内存,可初始化} 不分配内存,不可初始化
int a=13,b=-8;
int a=13,b=-8;
全局变量---外部变量 int p=1,q=5;
有效范围:从定义或有exetxetrenrnc声ha明r c的1,位c2置; 开始,直至它所 在源程序文件的结束。float f1(int a) { int b,c;
定义如 位#置de:f一ine般在YE程S 序1开#vad头re=fiLnEeNGLETHN*G2T; H WIDTH+40
作#u用nd域ef###可:ddd从eee终fff定iiinnn止eee义宏命NPO名IOU令作T例到例 宏3用0.展m文#1p#域d4ra开di件e1ninef5t:i(ffn9结i()n“ev2Hea6束er=lYWloE8,IW0DS+To4Hr0ld*”1)28;;0
内部函数
内部函数的定义格式如下: static 数据类型 函数名(形式参数表列) { 声明部分; 执行部分;
} 说明:static类型函数只能被其所在文件中的函数调用,
不能被其他文件中的函数调用
8.4 编译预处理
作用:对源程序编译之前做一些处理,生成扩展C 源程序
种类
宏定义 文件包含 条件编译
动态存储区
作用域:变量在某范围内有效-------局部变量与全局变量 函数作用域、函数原型作用域、文件作用域
生存期:变量在某一时刻存在-------静态变量与动态变量
变量的存储类型
auto -----自动型 register-----寄存器型 static ------静态型 extern -----外部型