C记得还是大一时学的,现在觉得好久没用了,又捧起来看看。今天刚看到有关static关键字,仔细地看了一遍《C和指针》这本书中的解释,现在觉得清楚多了。

  首先,我们将static关键字,修饰分为两类,一类是修饰变量,另一类则是修饰函数。下面我就分这两类来阐述下我个人的理解。

  一 、修饰变量

  static修饰变量我们也分为两类,一类是修饰全局变量,另一类则是修饰局部变量。

  (1)修饰全局变量

    全局变量是不再任何代码块中声明的变量(说直白点就是全局变量时在{}外面声明的变量)。

    例如:   

#include <stdio.h>
int a; //a就是一个全局变量 int main()
{
int b; //b则是一个局部变量
...
}

  OK,一个全局变量它被声明后,它就像富二代一样,一生下来就就具有某种特殊的属性。

  全局变量具有静态的存储属性(它存在于静态内存中,在程序运行前就被建立了,一直存在于程序的整个生命周期当中),而且它还具有external的链接属性(注意:是external而不是extern,它表示该变量可以被其他文件所引用)。

  而当你在上面的int a前面加个关键字static修饰时,他的第二个属性就改变了,变成了internal,它只能在所在文件中被使用,其他文件中则不能够使用它。

  下面我就举个具体的例子:

  extern_definition.c

  我在该文件定义了一个全局变量int a

#include <stdio.h>

int a = 1;

  extern_usage.c

#include <stdio.h>

extern int a;

int main() {

     printf("a comes from extern_definition.c is %d\n",a);
return ;
}

  编译,运行输出的结果是:

  

  当我把extern_definition.c文件中的int a = 1;改为static int a = 1;后的结果是:

  

  这时gcc编译器就报错啦,说是在文件extern_usuage.c中无法引用到变量a,这就验证了我们上述的说法。

  (2)修饰局部变量

   上面我们说了下,全局变量像是富二代拥有了许多“高贵”的属性,这里我们页也说说局部变量“屌丝”属性吧。

   局部变量,首先是“寿命“短(它具有的存储类型是自动存储类型,存储在堆栈中,作用域也就是在{}之中,出了{}它就没有了作用,就被销毁了),它的链接属性是none(无),在一个文件中的不同代码块内,它可以被重复定义,而且其他文件也访问不到它。

   当我们向局部变量前面添加static关键字之后,它就瞬间变得高大上了,它的存储类型就有自动类型变成了静态类型(它就会一直存在于程序运行的整个周期,而且程序中的任何地方都可以调用这个局部变量了)。

   下面我也继续举个例子来说明吧:

   static_func.c

#include <stdio.h>

int func()
{
int counter = ;
return ++counter;
} int main() { int answer;
answer = func() - func() * func();
printf("answer is : %d\n",answer);
return ;
}

  接下来我们编译运行,结果是

  这个结果,跟我想的结果是一致的,相当与这个函数func()每次返回的结果都是2,于是2-2*2=-2

  现在,我们将函数func中的int counter = 1;改为static int counter = 1;

  我们线猜下这次运行的结果会是多少,我的思路是,在整个程序运行过程中由于counter被声明为static类型,所以它一直存在于整个程序运行周期当中。

  所以结果是:2-3*4 = -10;(注意:还要提醒下,static 修饰过的变量它只初始化一次)。

  不出所料,结果就是这样的。

  

  二、static修饰函数

  static 修饰变量感觉理解起来比较轻松的话,那么static修饰函数又是什么意思呢?

  其实static修饰的函数就有点类似与我们学过面向对象语言(C++/Java)中的函数修饰符private,它只允许本文件中可以访问该函数,其他文件则不能够访问到函数。

  假如真要阐述清楚这个原理的话,这还是得用链接属性来说明。

  例如:

int a;
static int b; int function(void )
{
......
} ....

  在上面我们举了个函数名叫function的函数,它页不存在于任何的代码块内(也就是没被包括在{}当中),所以他就具有了external的链接属性,其他文件就可以访问该函数了,如果我们在该函数前面加上static修饰后,一切就会变得不一样了,function函数的链接属性就会由external变为了internal了,只能在本文件中被使用了。(其实这样做的好处就相当与C语言中的封装了,向外屏蔽了函数实现的具体细节了)。

  这里,我们也举个例子吧

  main.c

 #include <stdio.h>

 int main()
{
function();
return ;
}

  function.c

#include <stdio.h>

void function()
{
printf("This is in the function.c function function\n");
}

  没加static的运行的结果是:

  加了static的运行结果:

同样编译器报错说找不到函数function,这就成功验证了我们上述的说法。

  我想如果大家能看到这儿,C语言中的static关键字我们应该就能掌握地比较透彻了。

  

  转载请注明出处:http://www.cnblogs.com/woshijpf/  谢谢!

  

C语言中static关键字的用法的更多相关文章

  1. c语言中static关键字用法详解

    个人总结: 1.C不是面向对象的,在c中static修饰的变量或函数仅在当前文件中使用 2.C可以对局部变量使用static修饰(注意面向对象的java则不行),其放在全局区一直存在 概述static ...

  2. C语言中static关键字的作用

    static的作用(精辟分析) 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加sta ...

  3. C语言中const关键字的用法

    关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const呢,我想事物的存在一定有它自己的道理 ...

  4. C语言中static用法介绍

    C语言中static用法介绍     对于新手来说,很多东西的用法还不是很清楚,我们今天一起来看看C语言中static用法介绍     1.声明了static的变量称为静态变量,根据作用域的不同又分为 ...

  5. C语言中static的作用及C语言中使用静态函数有何好处

    转自:http://www.jb51.net/article/74830.htm 在C语言中,static的作用有三条:一是隐藏功能,二是保持持久性功能,三是默认初始化为0. 在C语言中,static ...

  6. C语言中static的使用方法【转】

    本文转自:http://blog.csdn.net/renren900207/article/details/21609649 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量 ...

  7. c语言中static 函数和普通函数的区别

    C程序一直由下列部分组成: 1)正文段——CPU执行的机器指令部分:一个程序只有一个副本:只读,防止程序由于意外事故而修改自身指令: 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放 ...

  8. C语言中system()函数的用法总结(转)

    system()函数功能强大,很多人用却对它的原理知之甚少先看linux版system函数的源码: #include <sys/types.h> #include <sys/wait ...

  9. C语言中extern关键字的使用

    C语言中extern关键字的使用,直接上代码. file1.c文件 #include<stdio.h> extern long power(int); int A = 2; int mai ...

随机推荐

  1. canvas入门之时钟的实现

    canvas 入门之作: 三步实现一个时钟: 直接上效果:   step 1  : 背景制作首先制作从1-12的数字: var canvas = document.getElementById('ca ...

  2. eclipse中将本地项目上传到svn库

    转载文章:http://blog.csdn.net/singit/article/details/48972197

  3. java.util.HashSet, java.util.LinkedHashMap, java.util.IdentityHashMap 源码阅读 (JDK 1.8)

    一.java.util.HashSet 1.1 HashSet集成结构 1.2 java.util.HashSet属性 private transient HashMap<E,Object> ...

  4. 三十天学不会TCP,UDP/IP网络编程-IP头格式祥述

    我又来了,这篇文章还是来做(da)推(guang)介(gao)我自己的!俗话说事不过三,我觉得我下次得换个说法了,不然估计要被厌恶了,但是我是好心呐,一定要相信我纯洁的眼神.由于这两年接触到了比较多的 ...

  5. TCP程序中发送和接收数据

    这里我们来探讨一下在网络编程过程中,有关read/write 或者send/recv的使用细节.这里有关常用的阻塞/非阻塞的解释在网上有很多很好的例子,这里就不说了,还有errno ==EAGAIN ...

  6. 程序员的自我救赎---3.2:SSO及应用案例

    <前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八) ...

  7. python3 爬虫---爬取豆瓣电影TOP250

    第一次爬取的网站就是豆瓣电影 Top 250,网址是:https://movie.douban.com/top250?start=0&filter= 分析网址'?'符号后的参数,第一个参数's ...

  8. iOS多线程与网络开发之发送接收server信息

    郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. (1).使用同步方法发送get请求(不经常使用) 2 /** 发送get消息 */ 3 - (void) testGet { 4 NSString *r ...

  9. BNUOJ34977夜空中最亮的星(数学,向量的应用)

    夜空中最亮的星 Time Limit: 2000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class name ...

  10. 揭秘传智播客班级毕业薪资超7k的内幕系列 之三 ----国企慕名而来,将未毕业学员“抢走”,传智播客又一次定义“被就业”

    前面文章提及Java六期学员张同学提前就业某国企,入职薪资6.3k,各种福利齐全.作为班级首位就业同学,他的就业也成为了班级其它同学就业的风向标.但事实上张同学的就业属于"被就业" ...