Chinaunix首页 | 论坛 | 博客
  • 博客访问: 403115
  • 博文数量: 96
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 415
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-22 09:08
个人简介

最近的研究方向:Nginx

文章分类
文章存档

2017年(2)

2016年(59)

2015年(35)

我的朋友

分类: C/C++

2015-10-09 11:36:00

C语言中的static关键字有时候很有用途,现在就来总结下C语言中static关键字的作用:
static修饰变量:
1.static修饰全局变量:全局变量本来就是保存在内存中的静态数据区的,所以static不会改变全局变量的保存位置(即全局变量还是保存在静态数据区),而和普通全局变量有区别的是它的作用域,用static修饰的全局变量的作用域为本文件作用域,比如一个项目可能有多个源文件,如果其他文件想要使用本文件中static修饰的全局变量是使用不了的。
2.static修饰的局部变量:局部变量本来是保存在栈上的,而用static修饰的话,该局部变量就被申明为静态的了,同时保存在内存中的静态数据区(即和全局变量保存在一块),但是它的作用域却没有变化,即还是本函数作用域,其他函数想要使用该变量是不被允许的。
static修饰函数:
被static修饰的函数,表明该函数的作用域是本文件作用域(和static修饰的全局变量作用域相同),其他源文件想要使用该函数也是不可以的。


综上static可以有如下几个作用:
1.如果加了static,就会对其它源文件隐藏。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。

2.static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围

3.static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加’\0’太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是’\0’


最近发现,对static的初始化和我想象的有点出入,我原本以为,可以把一个变量赋值给一个static修饰的变量,但是结果往往出人意料,编译器报了错,这才了解到,原来只能把常量复制给static修饰的变量。如:


点击(此处)折叠或打开

  1. #include<stdio.h>
  1. void func(int);
  1. int main(void)
  1. {
  1.     int n;
  1.     for(n=0;n<10;n++)
  1.     {
  1.         func(n);
  1.     }
  1.     return 0;
  1. }

  1. void func(int n)
  1. {
  1.     static int a = 5;    //编译通过
  1.     //static int b = a;    //编译报错        initializer element is not constant
  1.     static i;            //编译
  1.     printf("i = %d\n",i);
  1.     i++;
  1. }


运行结果为:

# ./test
i = 0
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9

看来实践才是硬道理啊!不可以想象主义了,哈哈~~




阅读(1361) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~