关键字——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
原文地址:http://19940325.blog.51cto.com/10789287/1712822