第十二章 C语言中用户标识符的作用域和存储类
12.1 局部变量、全局变量和存储分类
用户命名的标识符都有一个有效的作用域
作用域:指标识符在程序某一部分中有定义,
能被 C编译和连接程序所识别。
根据变量出现在程序中的不同位置,分为局部变量(内部变量)和全局变量(外部变量)
12.1局部变量、全局变量和存储分类局部变量:在函数内部或复合语句内部定义的变量。函数的形参也是局部变量( 可以说明为自动类和静态类)
外部变量:在函数外部定义的变量( 只能说明为静态类)
四个有关的说明符,auto,register,static、
extern
auto int i,j;或者 int auto i,j;
动态存储区(堆栈)
静态存储区程序代码区
12.2局部变量及其作用域和生存期
12.2.1 auto变量注意:无初值的自动变量 其值不定不同函数中使用了同名变量不会互相影响
auto变量:在函数内部或复合语句中定义时若没有指定存储类或使用了 auto说明符
float a;等价于 auto float a;
自动变量:它的作用域从定义的位置起到函数体结束止。如书 p170的一段程序。
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;
}
说明:
1,只能说明少量的寄存器变量
2.寄存器变量无地址,也不能对它求地址运算
3.定义应靠近使用的地方,用完尽快释放,
可通过放在复合语句中实现。
12.2.3 静态存储类的局部变量静态局部变量:在函数体或复合语句内部,用 static来说明一个变量。
作用域:与自动变量和寄存器变量一样区别,1.它在内存的静态存储区中占据永久的存储单元,即使退出此函数,也不释放该存储单元生存期:从程序运行开始到程序运行结束。
2.静态变量初值为 0
12.3.1 全局变量的作用域和生存期
12.3 全局变量及其作用域和生存期全局变量:只有静态一种类型,可使用
extern和 static 两种说明符全局变量,定义在函数外部任意位置上的变量作用域:从变量定义的位置起到整个源文件结束止。例如:
void fun1(void);
` void fun2(void);
int sum; /*定义全局变量 */
main()
{ … sum++;…..}
void fun1(void)
{ … sum++;…..}
int test;
void fun2(void)
{… sum++;test=1;…..}
12.3.1 全局变量及其作用域和生存期说明:
生存期是整个程序的运行期
如全局变量与某一函数的局部变量同名,则在该函数中,此全局变量 失去作用,局部变量与全局变量无任何关系。
见书 P173的程序不提倡使用全局变量
12.3.2 在同一编译单位内用 extern说明符来扩展全局变量的作用域当全局变量定义在后,而使用此全局变量的函数在前,必须在使用它的函数中用 extern对此全局变量进行说明!
注意:
1,全局变量的说明与定义不同。
2,定义代表开辟存储单元,只能出现一次,
不能使用 extern说明符。
3,全局变量的说明可以多次出现。
12.3.3 在不同编译单位内用 extern说明符来扩展全局变量的作用域
编译单位:每个可单独编译的源文件问题的产生:当在每个编译文件中均要使用同一个全局变量时解决方法:在其中一个文件中定义全局变量,而在其它用到此全局变量的文件中用 extern进行说明。见书
P174
12.3.4 静态全局变量定义:当用 static说明全局变量时。只限于本编译单位有效注:其它编译单位不能引用。可限制全局变量作用域的扩展。 见书 P174一段程序。
12.4.1 用 extern说明函数
12.4 函数的存储分类
一般的函数都隐含说明为 extern(称为外部函数)
外部函数的特征:可以被其它编译单位调用。
通常调用与被调用不在同一编译单位,且返回值为非整时,最好用 extern进行说明。
12.4.1 用 static说明函数
定义:定义一个函数时,在函数返回值的类型前面加上 static 称为静态函数。(又名内部函数)
静态函数的特征,不 可以被其它编译单位调用。
通常调用与被调用不在同一编译单位,且返回值为非整时,最好用 extern进行说明。
12.1 局部变量、全局变量和存储分类
用户命名的标识符都有一个有效的作用域
作用域:指标识符在程序某一部分中有定义,
能被 C编译和连接程序所识别。
根据变量出现在程序中的不同位置,分为局部变量(内部变量)和全局变量(外部变量)
12.1局部变量、全局变量和存储分类局部变量:在函数内部或复合语句内部定义的变量。函数的形参也是局部变量( 可以说明为自动类和静态类)
外部变量:在函数外部定义的变量( 只能说明为静态类)
四个有关的说明符,auto,register,static、
extern
auto int i,j;或者 int auto i,j;
动态存储区(堆栈)
静态存储区程序代码区
12.2局部变量及其作用域和生存期
12.2.1 auto变量注意:无初值的自动变量 其值不定不同函数中使用了同名变量不会互相影响
auto变量:在函数内部或复合语句中定义时若没有指定存储类或使用了 auto说明符
float a;等价于 auto float a;
自动变量:它的作用域从定义的位置起到函数体结束止。如书 p170的一段程序。
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;
}
说明:
1,只能说明少量的寄存器变量
2.寄存器变量无地址,也不能对它求地址运算
3.定义应靠近使用的地方,用完尽快释放,
可通过放在复合语句中实现。
12.2.3 静态存储类的局部变量静态局部变量:在函数体或复合语句内部,用 static来说明一个变量。
作用域:与自动变量和寄存器变量一样区别,1.它在内存的静态存储区中占据永久的存储单元,即使退出此函数,也不释放该存储单元生存期:从程序运行开始到程序运行结束。
2.静态变量初值为 0
12.3.1 全局变量的作用域和生存期
12.3 全局变量及其作用域和生存期全局变量:只有静态一种类型,可使用
extern和 static 两种说明符全局变量,定义在函数外部任意位置上的变量作用域:从变量定义的位置起到整个源文件结束止。例如:
void fun1(void);
` void fun2(void);
int sum; /*定义全局变量 */
main()
{ … sum++;…..}
void fun1(void)
{ … sum++;…..}
int test;
void fun2(void)
{… sum++;test=1;…..}
12.3.1 全局变量及其作用域和生存期说明:
生存期是整个程序的运行期
如全局变量与某一函数的局部变量同名,则在该函数中,此全局变量 失去作用,局部变量与全局变量无任何关系。
见书 P173的程序不提倡使用全局变量
12.3.2 在同一编译单位内用 extern说明符来扩展全局变量的作用域当全局变量定义在后,而使用此全局变量的函数在前,必须在使用它的函数中用 extern对此全局变量进行说明!
注意:
1,全局变量的说明与定义不同。
2,定义代表开辟存储单元,只能出现一次,
不能使用 extern说明符。
3,全局变量的说明可以多次出现。
12.3.3 在不同编译单位内用 extern说明符来扩展全局变量的作用域
编译单位:每个可单独编译的源文件问题的产生:当在每个编译文件中均要使用同一个全局变量时解决方法:在其中一个文件中定义全局变量,而在其它用到此全局变量的文件中用 extern进行说明。见书
P174
12.3.4 静态全局变量定义:当用 static说明全局变量时。只限于本编译单位有效注:其它编译单位不能引用。可限制全局变量作用域的扩展。 见书 P174一段程序。
12.4.1 用 extern说明函数
12.4 函数的存储分类
一般的函数都隐含说明为 extern(称为外部函数)
外部函数的特征:可以被其它编译单位调用。
通常调用与被调用不在同一编译单位,且返回值为非整时,最好用 extern进行说明。
12.4.1 用 static说明函数
定义:定义一个函数时,在函数返回值的类型前面加上 static 称为静态函数。(又名内部函数)
静态函数的特征,不 可以被其它编译单位调用。
通常调用与被调用不在同一编译单位,且返回值为非整时,最好用 extern进行说明。