【C语言天天练(二)】statickeyword
引言:
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的更多相关文章
- 【C语言天天练(二四)】内存分配
引言: 对于C语言程序,了解它执行时在内存中是怎样分配的对于我们理解它的执行机制是很实用的.以下就总结一下C语言程序的一些内存分配知识. 一 一段C程序.编译连接后形成的可运行文件一般有代码段.数据段 ...
- 【C语言天天练(二一)】内联函数
引言:调用函数时,一般会由于建立调用.传递參数.跳转到函数代码并返回等花费掉一些时间,C语言的解决的方法是使用类函数宏.在C99中,还提出了第二种方法:内联函数. 内联 ...
- 【C语言天天练(二)】预处理
引言: 学C语言之初.一提到预处理,脑子里想到的就是#define的宏定义以及#include包括的头文件.后来随着对C的深入学习发现.预处理不止这些.比方条件编译.提前定义的宏等等.以下对此进行总结 ...
- 【C语言天天练(二二)】位操作
C的位运算符 1.二进制反码或按位取反:~ ~(10011010) = (01100101). 假设val是一个unsigned char,~val不改名原来val的值. 2.位与:& 二进制 ...
- 【C语言天天练(十一)】深入理解指针
引言:在C语言中.指针的地位是不言而喻的,要想非常好的掌握C语言,掌握指针是必须的,这也是C语言不同于其它语言的地方. (一)指针的指针 样例: int i; int *pi;/*把pi初始化为指向变 ...
- 【C语言天天练(二三)】errno变量
引言: 在C编程中,errno是个必不可少的变量.特别是在网络编程中. 假设你没实用过errno,那仅仅能说明你的程序不够健壮. 为什么会使用errno呢?这是系统库设计中的一个无奈之举.他很多其它的 ...
- 【C语言天天练(九)】动态内存分配
引言:数组的元素存储于内存中连续的位置上.当一个数组被声明时.它所须要的内存在编译时就被分配. 可是,我们能够使用动态内存分配在执行时为它分配内存. 一块内存的生命周期能够分为四个阶段:分配.初始化. ...
- 【C语言天天练(十五)】字符串输入函数fgets、gets和scanf
引言:假设想把一个字符串读到程序中.必须首先预留存储字符串的空间.然后使用输入函数来获取这个字符串. 读取字符串输入的第一件事是建立一个空间以存放读入的字符串. char *name; scanf(& ...
- 【C语言天天练(三)】typedef具体解释
引言: typedef能够看作type define的缩写,顾名思义就是类型定义,也就是说它仅仅是给已有的类型又一次定义了一个方便使用的别名.并没有产生新的数据类型. typedef与define的不 ...
随机推荐
- mongodb学习(3)--- NodeJs使用mongoose操作mongodb
转载: https://cnodejs.org/topic/50c145ed637ffa4155c7eaee 首先对于以下错误说明(有写 db.close): Error: db object alr ...
- iterator & iterable
一. java.lang.Iterable java.util.Iterator Iterator是迭代器类,而Iterable是接口. 好多类都实现了Iterable接口,这样对象就可以调用iter ...
- [HNOI2012]矿场搭建(tarjan求点双)
题目 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无 ...
- JS与验证控件结合验证
原文发布时间为:2010-05-14 -- 来源于本人的百度文章 [由搬家工具导入] 把BUTTOn中 的return CheckFive()去 掉 .. 放 到 <Form id=" ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---11
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- 修饰符的范围+运算符优先级+构造方法特点+switch参数
一.修饰符的范围 修饰符的范围,是否可访问: 类型 private 无修饰 protected public 同一类 是 是 是 是 同一包中的子类 否 是 是 是 同一包中的非子类 否 是 是 是 ...
- Axisfault faultcode:Server.userException异常
---恢复内容开始--- Axisfault faultcode:Server.userException异常 AxisFault faultCode: {http://schemas.xmlsoap ...
- 已知一个序列A1.A2….An,给你一个整数K,找到满足所有Ai+Aj>=k的数对(i,j)的个数
#include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 100010 /* 已知一个序 ...
- codevs——2102 石子归并 2(区间DP)
时间限制: 10 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 在一个园形操场的四周摆放N堆石子,现要将石子有次序地 ...
- 2016集训测试赛(二十四)Problem C: 棋盘控制
Solution 场上的想法(显然是错的)是这样的: 我们假设棋子是一个一个地放置的, 考虑在放置棋子的过程中可能出现哪些状态. 我们令有序整数对\((i, j)\)表示总共控制了\(i\)行\(j\ ...