C语言课件 变量的存储属性
static(静态)变量
static变量存放在内存的静态存储区,在整个程序运行
期间占用固定的内存单元。 系统在编译时为static变量分配空间并赋初值,对未赋
值的内部static数值型变量,系统自动给它赋值为0; 对未赋值的内部static字符型变量,自动赋值为空字符。 因为在编译期时赋初值,所以只能赋一次初值且只能在 定义时进行。 再次调用static内部变量时,static内部变量的值为上 次调用结束时的值。 注意:static内部变量的作用域仍然是定义该变量的函 数体(或复合语句)内部。 对函数形参不能使用static。 不在必要时不要使用局部static变量.
格式: #undef 宏名{ …#d…efi.n. e LENGTH (WIYDETSH原+4作0用) 域
宏展开:预编译时,用}宏va体r=替LE换NG宏TH名*2-;--不作语法检查
例 引用其它文件中的外部变量
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;
}分配内存: 分配内存,可初始化} 不分配内存,不可初始化
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;
内部函数
内部函数的定义格式如下: static 数据类型 函数名(形式参数表列) { 声明部分; 执行部分;
} 说明:static类型函数只能被其所在文件中的函数调用,
不能被其他文件中的函数调用
8.4 编译预处理
作用:对源程序编译之前做一些处理,生成扩展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
#define #include #if--#else--#endif等
格式:
“#”开头 占单独书写行 语句尾不加分号
§8.4.1 宏定义
不带参数宏定义
一般形式: #define 宏名 [宏体]
功能:用指定标识符(宏名)代替字符序列(宏体)
宏一般名用中大不写允字许母有。空格,而例且#必de须fin遵e循WC变ID量TH命名80规则。宏名
…….
}
若外部变量与局部变量同名,则外部变量被屏蔽
外部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是外部变量*/ }
变量定义格式: [存储类型]
数据类型
变量表;
如: 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或有复效合语句)
{ 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());
auto(自动)变量
C系统默认内部变量的存储类型是auto类型。也可以显式使 用关键字auto来定义局部变量。
自动变量在其定义的函数(或复合语句)开始执行时才分 配内存空间,在该函数(或复合语句)执行期间占用内存 空间,在函数(或复合语句)执行结束时自动变量占用的 空间被系统释放。
若不对自动变量显式地赋初值,则它是一个不确定的值。
. . . }
file3.c
§8.3 内部函数和外部函数
外部函数
外部函数定义格式如下: extern 数据类型 函数名(形式参数表列) { 声明部分; 执行部分;
} 函数声明的格式为:
extern 数据类型 函数名(形式参数表列); 说明: • 外部函数既可被同一文件中函数调用,也可被其他 文件中的函数所调用 • 外部函数的定义和声明都可以省略关键字extern
存储方式
动态
存储区 动态区 寄存器
生存期 函数调用开始至结束
静态 静态存储区 程序整个运行期间
作用域 定义变量的函数或复合语句内 本文件 其它文件
赋初值 每次函数调用时
未赋初值
不确定
编译时赋初值,只赋一次 自动赋初值0或空字符
例 局部静态变量值具有可继承性
main() { void increment(void);
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()
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;
{ 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); }
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");
main:c 80
动态 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;
动态变量与静态变量
存储方式
静态存储:程序运行期间分配固定存储空间 动态存储:程序运行期间根据需要动态分配存储空间
内存用户区
生存期
静态变量:从程序开始执行到程序结束 动态变量:从包含该变量定义的函数开始执行至函数执行结束
变量存储类型
局部变量
外部变量
存储类别 auto register 局部static 外部static 外部
动态存储区
作用域:变量在某范围内有效-------局部变量与全局变量 函数作用域、函数原型作用域、文件作用域
生存期:变量在某一时刻存在-------静态变量与动态变量
变量的存储类型
auto -----自动型 register-----寄存器型 static ------静态型 extern -----外部型