c语言:静态作用(修饰函数、局部变量、全局变量)。
一、静态全局变量与普通全局变量有什么不同?
在说明全局变量(外部变量)之前加上static,即可构成静态全局变量。
全局变量本身是静态存储方法,静态全局变量当然也是静态存储方法。 两者的保存方法都没有区别。
这一区别在于,非静态全局变量的范围是整个源程序。 如果一个源程序由多个源文件组成,则非静态全局变量对每个源文件都有效。 静态全局变量限制作用域。 这意味着它只在定义变量的源文件中有效,不能在同一源程序的其他源文件中使用。 静态全局变量的范围仅限于一个源文件中,并且仅对该源文件中的函数通用,从而可以防止其他源文件中发生错误。
静态全局变量只初始化一次,不被其他文件单元引用;
二、静态局部变量和普通局部变量有什么区别?
将局部变量更改为静态变量后,更改保存方法将更改生存期。 将全局变量更改为静态变量会改变范围,限制使用范围。
静态局部变量被初始化一次,下次根据上次的结果值;
三、静态函数与普通函数有什么不同?
静态函数与普通函数作用域不同,仅在本手册中有。 仅用于当前源文件的函数必须描述为内部函数(静态限定函数),内部函数必须在当前源文件中描述和定义。 对于可以在当前源文件之外使用的函数,必须在头文件中说明使用这些函数的源文件中包含此头文件。
内存中只有一个静态函数,而常规函数在每次调用时维护一个副本。
四、静态的三个重要作用,首先是静态最主要的功能隐藏,其次是静态变量存储在静态存储中,因此具有持久性和默认值0。
1、隐藏
1.1同时编译多个文件时,所有没有静态前缀的全局变量和函数都是全局可见的。 为了理解这句话,我举例说明。 同时编译两个源文件。 一个是static_extern.c,另一个是static_main.c。
1.2static_main.c
#includestdio.h
语音主(语音) )。
{
扩展通道I; //externvariablemustbedeclaredbeforeuse
printf('%c ',I );
msg (;
返回0;
}
1.3static_extern.c
char i='A ';//全局可变
void msg () )
{
printf(Ilovebeijing! I Love hanyue! n ';
}
1.4编译执行
1.5“为什么static_extern.c中定义的全局变量I和函数msg在static_main.c中可用? 如上所述,所有没有静态前缀的全局变量和函数都具有全局可见性,并且可以访问其他源文件。 在此示例中,I是全局变量,msg是函数,并且都没有静态前缀,因此将为单独的源文件static_main.c显示。 添加静态时,其他源文件将隐藏。 例如,如果在定义I和msg之前添加静态,则static_main.c将无法看到它们。 利用此特性,可以在不同文件中定义同名函数和同名变量,而不必担心名称冲突。 静态可以用作函数和变量的前缀。 对函数来说,静态角色仅限于隐藏。
2、静态的第二个作用是保持变量的内容。 存储在静态数据区中的变量在程序开始执行后立即初始化,是唯一的初始化。 静态存储包含两种类型的变量:全局变量和静态变量。 但是,与全局变量相比,static可以控制变量的可见范围。 静态只是用于隐藏。 这样的使用方法不常见,举个例子吧。
2.1 static_main.c
#include stdio.h
intfun(void ) {
静态输入计数=10; //其实这个赋值语句没有被执行过
返回计数- -;
}
int count=1;
输入主(语音) )。
{
printf (全局 ttlocalstaticn );
for (; 计数=10计数)
printf(%dt ) t%dn )、count、fun );
返回0;
}
2.2编译执行
3、静态的第三个作用是默认初始化为0。 其实全局变量也有这个属性。 因为全局变量也存储在静态数据区域中。 在静态数据区域中,内存中所有字节的默认值为0x00,在某些情况下可以减少程序员的工作量。 例如,初始化稀疏矩阵时,可以将所有元素都设置为0,并为一些不是0的元素赋值。 静态定义将省略第一个设置为0的操作。 例如,要将字符数组用作字符串,每次在字符数组末尾加上“ 0”就很麻烦了。 如果静态定义字符串,则该字符串原本为“ 0”,因此可以省去此麻烦。 请做个小实验验证一下。
3.1 static_main.c
#include stdio.h
int a;
输入主(语音) )。
{
int i;
静态char str [ 10 ];
printf(integer:%d; string:(Begin ) %s ) end ) n ',a,str );
返回0;
}
2.2编译执行