【C语言天天练(二)】static关键字

引言:

       

        static关键字不仅可以修饰变量,而且可以修饰函数。了解它的用法,不仅对阅读别人的代码有帮助,也有助于自己写出更加健壮的程序。


用法:

        

       用于不同的上下文环境时,static关键字具有不同的意义。

      (一)

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

      (二)

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


示例解析:


代码解释一:

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






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值