static关键字的含义有哪些呢?如今总结以下:
1.static修饰变量
static能够修饰变量。当static修饰全局变量时,表示该变量的做用域只存在于本文件。其余文件就不能引用。好比:
在a.c文件里定义了2个全局变量:
static int x = 10;
int y = 0;
其中x前面有static关键字修饰,而y没有。那么在文件b.c里,若是想引用x,y,那么:
extern int y;//正确
extern int x;//错误
也就是说,x是不能再b.c文件里访问的,但y是能够的。这样作,实际上是为了防止模块与模块之间由于全局变量而形成的命名冲突。
当static修饰函数内的局部变量时,表示该变量存储在静态存储区,而不是存储在栈上。所以该变量具备记忆功能。函数每次执行后,它的值都不会丢失。
问题:下面的函数实如今一个数上加一个数,有什么错误? 如何改正?
int add_n ( int n )
{
static int i = 100;
i += n;
return i;
}
分析:因为i声明为static的类型,它存储在静态存储区,生命期为整个程序执行期间。所以,它的值在每次函数调用以后,都不会丢失。该函数原意是想对n加上100。可是实际执行的是,对n加上的并非100而是函数上次执行后i的值。 所以,应该把代码作以下改正:
int add_n ( int n )
{
int i = 100;
i += n;
return i;
}
实际上,C库中的strtok()函数就使用了static变量来计算。
如今来看一道Intel的面试题:
问题:A.c 和B.c两个c文件中使用了两个相同名字的static变量,编译的时候会不会有问题?这两个static变量会保存到哪里(栈仍是堆或者其余的)? html
答案:用关键字static的修饰的全局变量,代表这个变量仅在本文件(模块)中有意义,不会影响其余模块。这两个static变量保存在静态存储区。
关于更多static修饰变量的介绍,您还能够参考:《变量类型,做用域,存储空间,生命周期 》
2.static修饰函数
static关键字还能够修饰函数。在C语言里,static修饰函数,与static修饰全局变量做用是同样的,表示该函数仅在本文件中使用,其余文件中的函数不能调用此函数。其余文件中不能引用该函数,以免名字冲突。
3.static在C++中
在C++里,static修饰函数和变量,表示该函数或变量属于该C++类的静态成员,为全部对象共同全部。在类中,静态成员能够实现多个对象之间的数据共享,而且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。所以,静态成员是类的全部对象中共享的成员,而不是某个对象的成员。 使用静态数据成员能够节省内存,由于它是全部对象所公有的,所以,对多个对象来讲,静态数据成员只存储一处,供全部对象共用。
静态数据成员的值对每一个对象都是同样,但它的值是能够更新的。只要对静态数据成员的值更新一次,保证全部对象存取更新后的相同的值,这样能够提升时间效率。
静态成员函数不接受隐含的this自变量。因此,它就没法访问本身类的非静态成员。面试