引言:

       

        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. POJ1595 Prime Cuts

    Prime Cuts Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11961   Accepted: 4553 Descr ...

  2. [LeetCode] Linked List Cycle II 链表环起始位置

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...

  3. DOS头结构

    DOS头结构typedef struct _IMAGE_DOS_HEADER {                 // DOS .EXE header   +0h WORD   e_magic;    ...

  4. linux内核之情景分析mmap操作

    进程可以通过mmap把一个已打开文件映射到用户空间. mmap(void*start,size_t length,int prot,int flags,int fd,off_t offset) sta ...

  5. POJ2104 K-th Number(线段树)

    题目链接 K-th Number #include <cstdio> #include <cstring> #include <iostream> #include ...

  6. JDK1.5新特性:

    1.自动装箱与拆箱: 自动装箱的过程:每当需要一种类型的对象时,这种基本类型就自动地封装到与它相同类型的包装中. 自动拆箱的过程:每当需要一个值时,被装箱对象中的值就被自动地提取出来,没必要再去调用i ...

  7. Delphi 释放数组中的数据

    FillChar(aryTest[Low(aryTest)],    Length(aryTest) * SizeOf(aryTest[Low(aryTest)]), 0);

  8. iOS升级经验分享

    作者认为,及时关注.快速反应.覆盖测试是面对iOS系统升级时最重要的三大原则,文中还详细分析了iCloud Storage和Automatic Reference Counting这两大iOS 5新特 ...

  9. Oracle Forms Execute_Query Example To Fetch The Records From Database

    Execute_Query command is used to fetch all the records for current database data block in Oracle For ...

  10. 【IntelliJ IDEA】升级之后又要激活的解决方法

    用了几个月的idea,在它升级之后,又不听话了.启动时候需要重新激活. 解决方法: 1.找到C:\Windows\System32\drivers\etc\下的hosts文件 在文件中添加如下: 0. ...