初学者对static的认识

来源:互联网 发布:网络语笔芯是啥意思 编辑:程序博客网 时间:2024/05/16 11:22

  我觉得编程中的知识,只有经常去使用,或是因为使用这个语法不当而报错,绞尽脑汁,找出问题所在,加以改正,才能真正理解和掌握其中的奥妙。而对于一个像我这样的初学者,static,const这样的关键字是很少会被用到的。如今有了一些知识和经验,了解到这两个关键字的重要性,有时虽然不是必须的,但加以利用会使程序健壮性大大增加,使程序更加合理。

  首先这两个关键字都属于存储级别关键字。对于一些大牛来说,static和extern放在一起分析更加合理,毕竟有其用法的相似性和区别。但是作为一个初学者,曾遇到最不解的还是这两个大神常用而自己觉得用不着的关键字。

static

static的用法主要分为三种情况。

1.在全局变量中使用

用法:在全局变量的数据类型前加static。
改变:全局变量将变为静态全局变量
未变:静态全局变量和其他的全局变量的存储地点并没有区别,还是存储在原先的BSS段或数据段中。
作用:作用往往是初学者最关心的了。很多大牛对一些语法的分析深入浅出,但往往忽略了一些菜鸟最关心的问题,这玩意儿是干嘛用的?其作用就是使这一全局变量只在定义它的源文件内有效,其他源文件无法访问它。这在大型项目的编写中尤为重要(虽然也没做过),大型项目需要多人共同完成,每个人定义的变量可能会出现重名的情况。在整体编译时就会出现错误,为了避免这一情况的发生,我们就需要用到static修饰,打造只属于自己的全局变量。

  • 在static1.c中
#include<stdio.h>int a=1;
  • 在static2.c中
#include<stdio.h>int a=2;

gcc static1.c static2.c -o static -Wall
会报变量a被多次定义的错。

  • 在static1.c中
#include<stdio.h>static int a=1;
  • 在static2.c中
#include<stdio.h>static int a=2;

编译通过,且各自原文件输出的是各自的值。

2.在局部变量中使用

用法:在全局变量的数据类型前加static。
改变: 1. 位置:静态局部变量被编译器放在数据段,所以它虽然是局部的,但是在程序的整个生命周期中存在。
    2. 访问权限:静态局部变量只能被其作用域内的变量或函数访问。也就是说虽然它会在程序的整个生命周期中存在,由于它是static的,它不能被其他的函数和源文件访问。
    3. 值:静态局部变量如果没有被用户初始化,则会被编译器自动赋值为0(所以不会存在BSS段),以后每次调用静态局部变量的时候都用上次调用后的值。
作用:在静态局部变量中,对其前两点的使用并不太多。但是前两项的改变必须具备,正是有了这两种机制的改变,才使得我们可以利用其值的改变搞事情。比如像我们在一个函数中定义了一个变量,我们希望调用这个函数时,这个变量只被初始化一次,而后每次调用都沿用上次修改后的值,这个时候就必须要用到static了。例:

#include<stdio.h>int func(){    static int x=0;    x++;    return x;}int main(){    int a=0;    while(a<5)    {        a=func();        printf("%d ",a);    }    printf("\n");    return 0;}

其输出结果为1 2 3 4 5

3.用在函数身上

用法:在函数返回值类型前加static。
改变: 限制其作用域为本源文件。
作用:同上面全局变量一样,也只是为了加一个限制条件, 当你的程序中有很多个源文件的时候,你肯定会让某个源文件只提供一些外界需要的接口,其他的函数可能是为了实现这些接口而编写,这些其他的函数你可能并不希望被外界(非本源文件)所看到,这时候就可以用static修饰这些不希望被看到的函数。

总结

  总体来讲,static的主要作用分两点。一方面是起限制作用,被你标记的就是你的,别人是不能乱动你的东西的。就算他有个名字和你一样的,也只能他用他的你用你的,万一拿错了,也不会使。而另一方面大用处就是加了static的变量只被初始化一次,在统计函数的调用次数时就要用到。

初来乍到,有疏漏的地方望各位大牛多多指教~~

1 0
原创粉丝点击