首页 > C > 数据类型与变量 阅读:57,774

static关键字

StaticC语言中的一个关键字,可以用来修饰变量和函数等标识符。那么,在不同情况下,它表示什么含义呢?

1static修饰变量

static可以修饰变量。当static修饰全局变量时,表示该变量的作用域只存在与本文件。其他文件就不能引用。当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变量会保存到哪里(栈还是堆或者其他的)?

答案:用关键字static的修饰的全局变量,表明这个变量仅在本文件(模块)中有意义,不会影响其他模块。这两个static变量保存在静态存储区。

2static修饰函数

static关键字还可以修饰函数。在C语言里,static修饰函数,表示该函数仅在本文件中使用,其他文件中的函数不能调用此函数。其他文件中不能引用该函数,以避免名字冲突。

3staticC++

C++里,static修饰函数和变量,表示该函数或变量属于该C++类的静态成员,为所有对象共同所有。在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。

使用静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。

静态成员函数不接受隐含的this自变量。所以,它就无法访问自己类的非静态成员。

周哥教IT,分享编程知识,提高编程技能,程序员的充电站。跟着周哥一起学习,每天都有进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

当你决定关注「周哥教IT」,你已然超越了90%的程序员!

IT黄埔-周哥教IT技术交流QQ群:213774841,期待您的加入!

二维码
微信扫描二维码关注