引言:

       

        statickeyword不仅能够修饰变量。并且能够修饰函数。了解它的使用方法,不仅对阅读别人的代码有帮助,也有助于自己写出更加健壮的程序。



使用方法:

        

       用于不同的上下文环境时,statickeyword具有不同的意义。

      (一)

        当它用于函数定义时,或用于代码块之外的变量声明时,statickeyword用于改动标示符的链接属性,从externl改为internal。但标示符的存储类型和作用域不受影响。这样的方式声明的函数或变量仅仅能用于声明它们的源文件里。

      (二)

        当它用于代码块内部的变量声明时,statickeyword用于改动变量的存储类型,从自己主动变量改动为静态变量。但变量的链接属性和作用域不受影响。用这样的方式声明的变量在程序运行之前创建,并在程序的整个运行期间一直存在,而不是每次在代码块開始运行时创建,在代码块运行完成后销毁。



演示样例解析:



代码解释一:

main.c源代码

#include <stdio.h>
#include "test.h" void main(void)
{
fun(); /*fun函数就是在test.c文件里声明的函数*/
printf("j = %d\n", j);/*j变量也是在test.c文件里声明的变量*/
}

test.c源代码

#include <stdio.h>

static int i = 1;/*声明为内部变量,仅仅能用于test.c源文件*/
int j = 2;/*能够作为外部变量使用,在main文件里用到了*/ static void fun1(void)/*声明为内部函数,仅仅能用在test.c源文件里*/
{
printf("i+1 = %d, j+1 = %d\n", i+1, j+1);
} void fun(void)/*能够用在其它文件里,用在main文件里*/
{
printf("i = %d, j = %d\n", i, j);
fun1();
}

test.h源代码

extern int j;
extern void fun(void);

编译上面的程序:gcc main.c test.c -o test生成可运行文件test

执行可执行文件test显示结果例如以下:

i = 1, j = 2//该行是由main函数里调用的test.c文件里的fun函数生成的
i+1 = 2, j+1 = 3//该行是由test文件里fun函数调用的fun1函数生成的
j = 2//这是由main函数使用外部变量j直接生成的

代码解释二:

test.c源代码

#include <stdio.h>

void main(void)
{
int i = 1;
printf("i = %d\n", i);
}

teststatic.c源代码

#include <stdio.h>

void main(void)
{
static int i = 1;/*用于代码块内部变量的声明*/
printf("i = %d\n", i);
}

编译上面的两个文件

gcc test.c -o test 

gcc teststatic.c -o teststatic

生成两个可运行文件test和teststatic

使用size命令查看两个可运行文件各个段大小:size test teststatic

text data bss dec   hex filename

929  264     8   1201 4b1 test

929   268    8   1205 4b6 teststatic

使用static修饰的程序data段更大。由于它在程序运行之前创建,并一直存在到程序运行结束。



补充:



关于作用域存储类型的解释,參考:

http://blog.csdn.net/to_be_it_1/article/details/24450227

http://blog.csdn.net/to_be_it_1/article/details/24467879









【C语言天天练(二)】statickeyword的更多相关文章

  1. 【C语言天天练(二四)】内存分配

    引言: 对于C语言程序,了解它执行时在内存中是怎样分配的对于我们理解它的执行机制是很实用的.以下就总结一下C语言程序的一些内存分配知识. 一 一段C程序.编译连接后形成的可运行文件一般有代码段.数据段 ...

  2. 【C语言天天练(二一)】内联函数

            引言:调用函数时,一般会由于建立调用.传递參数.跳转到函数代码并返回等花费掉一些时间,C语言的解决的方法是使用类函数宏.在C99中,还提出了第二种方法:内联函数.         内联 ...

  3. 【C语言天天练(二)】预处理

    引言: 学C语言之初.一提到预处理,脑子里想到的就是#define的宏定义以及#include包括的头文件.后来随着对C的深入学习发现.预处理不止这些.比方条件编译.提前定义的宏等等.以下对此进行总结 ...

  4. 【C语言天天练(二二)】位操作

    C的位运算符 1.二进制反码或按位取反:~ ~(10011010) = (01100101). 假设val是一个unsigned char,~val不改名原来val的值. 2.位与:& 二进制 ...

  5. 【C语言天天练(十一)】深入理解指针

    引言:在C语言中.指针的地位是不言而喻的,要想非常好的掌握C语言,掌握指针是必须的,这也是C语言不同于其它语言的地方. (一)指针的指针 样例: int i; int *pi;/*把pi初始化为指向变 ...

  6. 【C语言天天练(二三)】errno变量

    引言: 在C编程中,errno是个必不可少的变量.特别是在网络编程中. 假设你没实用过errno,那仅仅能说明你的程序不够健壮. 为什么会使用errno呢?这是系统库设计中的一个无奈之举.他很多其它的 ...

  7. 【C语言天天练(九)】动态内存分配

    引言:数组的元素存储于内存中连续的位置上.当一个数组被声明时.它所须要的内存在编译时就被分配. 可是,我们能够使用动态内存分配在执行时为它分配内存. 一块内存的生命周期能够分为四个阶段:分配.初始化. ...

  8. 【C语言天天练(十五)】字符串输入函数fgets、gets和scanf

    引言:假设想把一个字符串读到程序中.必须首先预留存储字符串的空间.然后使用输入函数来获取这个字符串. 读取字符串输入的第一件事是建立一个空间以存放读入的字符串. char *name; scanf(& ...

  9. 【C语言天天练(三)】typedef具体解释

    引言: typedef能够看作type define的缩写,顾名思义就是类型定义,也就是说它仅仅是给已有的类型又一次定义了一个方便使用的别名.并没有产生新的数据类型. typedef与define的不 ...

随机推荐

  1. oracle char和varchar2的区别

    char的长度是固定的,varchar2长度是可以变化的.比如:存储的是“abc”,对于char(20)来说,表示你存储的占20个字节(包括17个空字符):而对于varchar2(20)来说,表示你存 ...

  2. mysql 排序字段与索引有关系吗?

    mysql 排序字段与索引有关系吗?答案与否需要你explain一下你的sql脚本 另外记住:date_add()方法会影响Index_modify_time索引(即:时间字段索引)  一般遇到这样的 ...

  3. RocketMq使用注意事项

    Topic 一个Topic是一个主题.一个系统中,我们可以将消息划成Topic,这样,将不同的消息发送到不同的queue. Queue 一个topic下,我们可以设置多个queue,每个queue就是 ...

  4. 访问外网 ML2 的配置

    通过 router 可以实现位于不同 vlan 中的 instance 之间的通信. 接下来要探讨的问题是 instance 如何与外部网络通信. 这里的外部网络是指的租户网络以外的网络. 租户网络是 ...

  5. 【转】利用ScriptManager实现Javascript调用WebService中的方法

    原文发布时间为:2009-07-01 -- 来源于本人的百度文章 [由搬家工具导入] 前台调用后台方法,或者后台调用前台方法。ScriptManager实现 开发过程中,总想在前台直接调用后台的met ...

  6. Selenium2+python自动化(unittest)

    # coding:utf-8from selenium import webdriverimport unittestimport timeclass Bolg(unittest.TestCase): ...

  7. javascript实现复选框的全选全不选

    通过复选框的id获取到复选框 元素 对复选框绑定点击事件 每个checkbox都设置相同的name checkOne 通过得到的元素获取checkbox的状态 当点击全选全不选checkbox时,检查 ...

  8. hdu 2669(扩展欧几里得)

    Romantic Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  9. C++ STL之count函数

    谓词(predicate):是做某些检测的函数,返回用于条件判断的类型,指出条件是否成立. 总结: count : 在序列中统计某个值出现的次数 count_if : 在序列中统计与某谓词匹配的次数 ...

  10. jQuery 基础学习

    jQuery 可以按照网站进行查看 http://jquery.cuishifeng.cn/ jQuery 模块  <=>类库 DOM/BOM/JavaScript的类库 一 查找元素 j ...