关键字——static

static主要有以下三个作用:

1. 局部静态变量(c/c++
2. 外部静态变量/函数(c/c++
3. 静态数据成员/成员函数 (c++特有
1.局部静态变量

  静态局部变量,在函数里面定义的,就只能在这个函数里用了。由于被static修饰的变量只存在内存的静态区、所以即使函数运行结束,这个静态变量的值不会销毁,下次调用还能调用到这个值。

在C/C++中, 局部变量按照存储形式可分为三种auto, static, register。

(1). 存储空间分配和生存周期不同
       auto类型局部变量就是普通的局部变量(不加修饰的局部变量默认为该类型)。该类型局部变量存储在栈上,在动态存储区,生命周期仅限于定义它的函数,函数结束,它就自动释放。static类型局部变量存储在静态存储区,在程序整个运行期间都不释放。两者之间的作用域相同,但生存期不同。

(2). static局部变量在所处模块在初次运行时进行初始化工作,且只操作一次。

(3). 对于局部静态变量,如果不赋初值,编译期会自动赋初值0或空字符,而auto类型的初值是不确定的。

2. 外部静态变量/函数

       作用域仅限于变量被定义的文件中,其它文件即使使用extern声明也没办法使用,准确地说作用域从定义处开始到定义结束。在定义之外使用,需在前面加extern。

3. 静态数据成员/成员函数 (c++特有

      用来表示不能被其它文件访问的函数。但为了限制全局变量/函数的作用域, 函数或变量前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函 数)。

表示属于一个类而不是属于此类的任何特定对象的变量和函数. 这是与普通成员函数的最大区别,也是其应用所在, 比如在对某一个类的对象进行计数时, 计数生成多少个类的实例,就可以用到静态数据成员. 在这里面, static既不是限定作用域的, 也不是扩展生存期的作用, 而是指示变量/函数在此类中的唯一性. 这也是”属于一个类而不是属于此类的任何特定对象的变量和函数”的含义. 因为它是对整个类来说是唯一的,因此不可能属于某一个实例对象的. (针对静态数据成员而言, 成员函数不管是否是static, 在内存中只有一个副本, 普通成员函数调用时, 需要传入this指针, static成员函数调用时, 没有this指针. )

例题:求出i与j的值。

#include<stdio.h>
static int j;
void fun1()
{
	static int i=0;
	i++;
}
void fun2(void)
{
	j=0;
	j++;
}
int main()
{
	int i=0;
	int k=0;
	for(k=0;k<10;k++)
	{
		fun1(i);
		fun2();
	}
	printf("i=%d,j=%d\n",i,j);
	return 0;
}
输出:i=0,j=1