第十二章C语言中用户标识符的作用域 和存储类 12.1局部变量、全局变量和存储分类 用户命名的标识符都有一个有效的作用域 作用域:指标识符在程序某一部分中有定义 能被C编译和连接程序所识别 根据变量出现在程序中的不同位置,分为局 部变量(内部变量)和全局变量(外部变量)
第十二章 C语言中用户标识符的作用域 和存储类 12.1 局部变量、全局变量和存储分类 •用户命名的标识符都有一个有效的作用域 •作用域:指标识符在程序某一部分中有定义, 能被C编译和连接程序所识别。 •根据变量出现在程序中的不同位置,分为局 部变量(内部变量)和全局变量(外部变量)
12.1局部变量、全局变量和存储分类 局部变量:在函数内部或复合语句内部定 义的变量。函数的形参也是局部变量(可 一以说明为自动类和静态类) 外部变量:在函数外部定义的变量(只能 说明为静态类) 四个有关的说明符:auto、 register、 static、 extern auto int 1,j;或者 int auto 1,ji;
12.1局部变量、全局变量和存储分类 局部变量:在函数内部或复合语句内部定 义的变量。函数的形参也是局部变量(可 以说明为自动类和静态类) 外部变量:在函数外部定义的变量(只能 说明为静态类) 四个有关的说明符:auto、register、static、 extern auto int i,j;或者 int auto i,j;
动态存储区(堆栈) 静态存储区 程序代码区 122局部变量及其作用域和生存期 1221auto变量
动态存储区(堆栈) 静态存储区 程序代码区 12.2局部变量及其作用域和生存期 12.2.1 auto变量
auto变量:在函数内部或复合语句中定义时 若没有指定存储类或使用了auto说明符 float a;等价于 auto float a; 自动变量:它的作用域从定义的位置起到函 数体结束止。如书p170的一段程序。 注意:无初值的自动变量其值不定 不同函数中使用了同名变量不会互相影响
注意:无初值的自动变量其值不定 不同函数中使用了同名变量不会互相影响 auto变量:在函数内部或复合语句中定义时 若没有指定存储类或使用了auto说明符 float a;等价于 auto float a; 自动变量:它的作用域从定义的位置起到函 数体结束止。如书p170的一段程序
1222 register变量 寄存器变量也是自动变量 区别:变量的值保留在CPU的寄存器中,不占内存单元 优点:有助于提高程序的运行速度。 例121计算Xn maino f int S; s=power(5, 3) printf(“%dn”),S) power(int x, register int n) register int p for(p=1; n; n--)p=p*X return p
12.2.2 register变量 寄存器变量也是自动变量 区别:变量的值保留在CPU的寄存器中,不占内存单元。 优点:有助于提高程序的运行速度。 例12.1 计算Xn main() { int s; s=power(5,3); printf(“%d\n”),s); } power(int x,register int n) { register int p; for(p=1; n; n--) p=p*x; return p; }
说明: 只能说明少量的寄存器变量 2寄存器变量无地址,也不能对它求地址 运算 3.定义应靠近使用的地方,用完尽快释放, 可通过放在复合语句中实现
说明: 1. 只能说明少量的寄存器变量 2.寄存器变量无地址,也不能对它求地址 运算 3.定义应靠近使用的地方,用完尽快释放, 可通过放在复合语句中实现
1223静态存储类的局部变量 静态局部变量:在函数体或复合语句内部,用 I static来说明 个变量 作用域:与自动变量和寄存器变量一样 区别:1它在内存的静态存储区中占据永久的存储单元即 使退出此函数,也不释放该存储单元 生存期:从程序运行开始到程序运行结束 2静态变量初值为0
12.2.3 静态存储类的局部变量 静态局部变量:在函数体或复合语句内部,用static来说明 一个变量。 作用域:与自动变量和寄存器变量一样 区别:1.它在内存的静态存储区中占据永久的存储单元,即 使退出此函数,也不释放该存储单元 生存期:从程序运行开始到程序运行结束。 2.静态变量初值为0
123全局变量及其作用域和生存期 1231全局变量的作用域和生存期 全局变量:只有静态一种类型,可使用 extern和 static两种说明符 全局变量:定义在函数外部任意位置上的变量 作用域:从变量定义的位置起到整个源文件结 束止。例如:
12.3.1 全局变量的作用域和生存期 12.3 全局变量及其作用域和生存期 全局变量:只有静态一种类型,可使用 extern和static 两种说明符 全局变量:定义在函数外部任意位置上的变量 作用域:从变量定义的位置起到整个源文件结 束止。例如:
void fun1(void) void fun2(void); int sum,/*定义全局变量* maino sum++ void funI(void) sum++ int test void fun 2(void …Sum;test=1;}
void fun1(void); ` void fun2(void); int sum; /*定义全局变量*/ main() { … sum++;…..} void fun1(void) { … sum++;…..} int test; void fun2(void) {… sum++;test=1;…..}
123.1全局变量及其作用域和生存期 说明: ·生存期是整个程序的运行期 如全局变量与某一函数的局部变量同 名,则在该函数中,此全局变量失去作 用,局部变量与全局变量无任何关系。 见书P173的程序 不提倡使用全局变量
12.3.1 全局变量及其作用域和生存期 说明: • 生存期是整个程序的运行期 •如全局变量与某一函数的局部变量同 名,则在该函数中,此全局变量 失去作 用,局部变量与全局变量无任何关系。 见书P173的程序 不提倡使用全局变量