是的,static变量初始值一定要是常量。
static变量中文名叫静态变量。它与普通的变量比起来有如下几个区别:
1)位置:静态局部变量被编译器放在全局存储区data,所以它虽然是局部的,但是在程序的整个生命周期中存在。
2)访问权限:静态局部变量只能被其作用域内的变量或函数访问。也就是说虽然它会在程序的整个生命周期中存在,由于它是static的,它不能被其他的函数和源文件访问。
3)值:静态局部变量如果没有被用户初始化,则会被编译器自动赋值为0,以后每次调用静态局部变量的时候都用上次调用后的值。这个比较好理解,每次函数调用静态局部变量的时候都修改它然后离开,下次读的时候从全局存储区读出的静态局部变量就是上次修改后的值。
首先说一下什么是静态变量(常量也是一样的道理),你可以这么理解,不管哪声明的静态变量,其实都可以当作全局变量,但和普通的全局变量不同的是该静态变量只能在其声明的作用域中使用,出了这个作用域就不能用了。
那么你的问题也就出来了,在函数内声明的静态变量其实就是一个全局变量,只不过它只能在函数内部用;在函数外声明的,有两种,一种是类中的成员(C++的概念,既然你问c这里就不赘述了),另外一种就是文件作用域的静态变量,有文件作用域的静态变量只能在包含它的c文件中使用,如果是声明在头文件中的静态变量,那么在不同的c文件包含它的时候,会各自生成一个独立的副本,也就是说每个包含它的c文件中的该变量其实是互不相干的;而有文件作用域的静态变量和在当前c文件下全局变量是一样的,不一样的是其他c中的情况。
那么在函数内声明的静态变量和函数中的局部变量有什么区别呢?区别就是静态变量只有第一次运行函数的时候被创建,并且在函数结束的时候不会消亡;而普通的成员在函数结束的时候就会在内存中退栈消亡。
说了那么多,举个例子:
//Ex_1c
void fun_1 ()
{
static int a = 0;
a ++;
printf ("%d", a);
}
void fun_2 (int times)
{
int i = 0;
for (;i < times; i++)
{
fun_1 ();
}
}
之后再执行fun_2的话,就会依次打印:12345直到times;
如果去掉static关键字,执行fun_2,屏幕就会打印111111次数为times次;
下面举例说明一下函数外的:
//Hh
#ifndef _H_H_
#define _H_H_
static int a = 0;
#endif
//Ex_2c
#include "Hh"
void fun_ex2 ()
{
a++;
printf ("%d", a);//这时会打印1
}
//Ex_3
#include "Hh"
void fun_ex3 ()
{
printf ("%d", a);//这时打印的依然是0,即便先被Ex_2中的fun_ex2()函数修改过,因为他们
//是两个独立的副本
}
额,说的太啰嗦了,希望你明白了哈~~~
当调用函数时,函数定义的变量、数据等会临时分配一个空间,当函数执行完后,系统会自动释放这段空间,但当对变量加static关键字时,这个变量就相当于是一个全局变量,他的生命周期是整个程序的生命周期
static的变量只不过会保留上一次的值,它的有效范围依然和普通变量一样受到作用域的局限,所以在方法中定义的static变量只能在这个方法中用,其它方法是无法调用它的。唯一的解决方法就是把它变成全局变量,也就是从方法体里提到外面。
a生存期是整个程序运行期间,a位于系统的堆中。
静态表示的是内存的共享,就是它的每一个实例都指向同一个内存地址
作用域应该是在函数内,但是可以通过函数funce调用。
a这个对象只会生成一个
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)