Static在C语言里面有两个作用,第一个是修饰变量,第二个是修饰函数

1、Static修饰变量

按照作用范围的不同,变量分为局部变量全局变量。如果用static修饰变量,不论这个变量是全局的还是局部的都是存储在静态数据区。下面分开来讲:

¨          如果用static修饰全局变量,我们称其为静态全局变量。

我们用static修饰全局变量的主要目的就是:使得其作用域仅限于变量被定义的文件中(即从变量定义处到本文件结尾处),其它文件不论通过什么方式都不能访问。

¨          如果用static修饰局部变量,我们称其为静态局部变量。

我们用static修饰局部变量的目的主要有两个:

1)         在某个函数体里面定义的静态局部变量,只能在本函数体被访问,即使同一个文件的其它函数也访问不了。

2)         静态局部变量总存储在静态数据区,所以即使这个函数运行结束,这个静态局部变量的值不会被销毁,函数下次使用时仍然要用到这个值。

 

下面给出一个例程:

#include <stdio.h>

static int j;  // 静态全局变量
int fun1(void)
{
         static int i = 0;
         i++;
         return i;
}

int fun2(void)
{
         j = 0;
         j++;
         return j;
}

int main(int argc, char *argv[])
{
         int k = 0, m = 0, n = 0;
         for(k=0; k<10; k++){
                   m = fun1( );
                   n = fun2( );
                   printf("%d,%d\n", m, n);
         }
         return 0;
}

结果:

1,1
2,1
3,1
4,1
5,1
6,1
7,1
8,1
9,1
10,1

 

从例程的运行结果可以看出:

对于fun1( ),运行一次之后,变量i保持了原来的数据,并没有销毁,而是在下一次调用的时候继续使用,所以才会有1、2、3…10这样的结果。而对于fun2( ),运行一次之后,变量j的值被销毁了,所以第二次调用结束j仍然保持原值“1”,所以循环十次,每次都是1

 

2、Static修饰函数

在函数前加static,则此函数成为静态函数(内部函数),我们用static修饰函数的主要目的是:用来表示不能被其它文件访问的一个函数(和用static修饰全局变量的目的一样,都是不允许其它文件访问)。这样一来便有一个好处:程序员不用担心自己编写的函数与其他文件的函数同名

 

 

 

对局部静态变量的特别说明

(1)静态局部变量数据属于静态存储类别,在静态存储区内分配内存单元,在整个程序运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储区空间而不占用静态存储区空间,函数调用结束后立即释放空间。

(2)静态局部变量时在编译时被赋值的,即自始至终只赋值一次,在程序运行时它已经有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。而自动变量赋初值,不是在编译时进行的,而是在运行时进行,所以每调用一次函数就赋一次初值。

(3)如在定义局部变量时不赋初值,则对静态局部变量来说,编译时自动赋一个初值0(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值,则它的值是一个不确定的值。这是由每次动态分配的内存单元不同所决定的。

C语言--static修饰变量的更多相关文章

  1. iOS Block的简单使用以及__block 和static修饰变量

    简单的代码总结,不足之处多多指教. //简单的使用 -(void)blockOne{ ; int(^BlockOne)(int) = ^(int num2) { return number*num2; ...

  2. C语言 static静态变量

    静态变量类型说明符是static. 静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在 静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间 ...

  3. php中函数内使用static修饰变量

    首先理解静态变量的区别,声明一个函数test() function num(){ $a = 0; echo $a; $a++; } num();num();num(); //输出000 functio ...

  4. C语言--static修饰函数

    在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. 介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性 ...

  5. C语言中static修饰符的意义

    在C语言中,static通常有2种含义:1)定义变量的生命周期:2)定义变量或者函数的作用域. 变量的生命周期是指,相对于程序运行的进程生命周期,变量存在的时间段.变量的生命周期由变量的存储类型(位置 ...

  6. C 语言 static、extern与指针函数介绍

    1.exit(0)正常退出程序 exit(1)程序异常时退出程序 2.static(静态变量)修饰局部变量 在局部变量使用static修饰,会延长局部变量的存在期.但我们需要注意一下几点: 虽然sta ...

  7. JAVA_SE基础——34.static修饰成员变量

    需求:描述一下学校的学生.  特点:都是中国人.... 测试代码1: class Student{ String name; String country = "中国"; //国籍 ...

  8. static和fianl修饰变量的区别

    参考:http://hllvm.group.iteye.com/group/topic/37682 http://blog.csdn.net/javakuroro/article/details/68 ...

  9. static 修饰的变量在程序中容易出现的问题

    package lianxi; public class StaticTest {    int a = 0;    static int b =0;    StaticTest(){         ...

随机推荐

  1. Linux配置服务器的一点总结

    一.Linux初始化服务 首先搞清楚四个概念: 进程:正在运行的程序,有自己独立的内存空间. 线程:是进程的下属单位,开销较进程小,没有自己独立的内存空间. 作业:由一系列进程组成,来完成某一项任务. ...

  2. Python中模块之logging & subprocess的讲解

    subprocess & logging模块的介绍 1. subprocess 该模块替代了os.system & os.pawn*所实现的功能. 2. logging 1. 日志五大 ...

  3. 《Java技术》第三次作业

    (一)学习总结 1.阅读下面程序,分析是否能编译通过?如果不能,说明原因.应该如何修改?程序的运行结果是什么?为什么子类的构造方法在运行之前,必须调用父 类的构造方法?能不能反过来? class Gr ...

  4. 关于一些基础的Java问题的解答(六)

    26. ThreadPool用法与优势 ThreadPool即线程池,它是JDK1.5引入的Concurrent包中用于处理并发编程的工具.使用线程池有如下好处: 降低资源消耗:通过重复利用已创建的线 ...

  5. ServiceStack 简单服务搭建

    1:定义数据实体 因为ServiceStack是基于请求参数来定义请求路由的,所以关键的是请求参数一定要定义好,同时可以在请求参数上自定义路由名和请求方式,作为对外接口名 上代码: namespace ...

  6. python学习之路网络编程篇(第五篇)-续篇

    Python堡垒机实现之基础知识 一般的堡垒机必须要具备以下5个基本功能: 1.权限控制 2.执行命令 3.上传下载文件 4.远程登录 5.记录操作 权限控制 说明:根据不同的登录用户分配不同的可管理 ...

  7. MongoDB 监控

    在你已经安装部署并允许MongoDB服务后,你必须要了解MongoDB的运行情况,并查看MongoDB的性能.这样在大流量得情况下可以很好的应对并保证MongoDB正常运作. MongoDB中提供了m ...

  8. Docker的Fig 项目

    在你的应用里面添加一个 fig.yml 文件,并指定一些简单的内容,执行 fig up 它就能帮你快速建立起一个容器 快速搭建基于 Docker 的隔离开发环境 使用 Dockerfile 文件指定你 ...

  9. JavaScript 调试

    在编写 JavaScript 时,如果没有调试工具将是一件很痛苦的事情. JavaScript 调试 没有调试工具是很难去编写 JavaScript 程序的. 你的代码可能包含语法错误,逻辑错误,如果 ...

  10. 初识Spark2.0之Spark SQL

    内存计算平台spark在今年6月份的时候正式发布了spark2.0,相比上一版本的spark1.6版本,在内存优化,数据组织,流计算等方面都做出了较大的改变,同时更加注重基于DataFrame数据组织 ...