关键字static的作用和用途

7 篇文章 0 订阅

在C语言中,关键字static的意思是静态的,主要有三种作用:(修饰函数,全局变量,局部变量)

(1)在函数体内,一个被声明为静态的变量在这一函数被调用的过程中其值维持不变。

(2)在模块内(但是在函数外),它的作用域范围是有限制的,如果一个变量被声明为静态的,那么该变量可以被模块内所有的函数访问,但不能被模块外的其他函数访问。

(3)内部函数应该在当前源文件中说明和定义,对于可在当前源文件以外使用的函数,应该在一个头文件中说明,使用这些函数的源文件要包含这个头文件。

 

1.static全局变量和普通全局变量的区别:

       全局变量的说明之前加static就构成了静态的全局变量。

       全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式,在存储方式上并无差别。二者的区别在于作用域不同,非静态全局变量的作用域的是整个源程序。当一个源程序由多个源程序组成时,非静态全局变量在各个源文件都是有效的。而静态全局变量则限制了其作用域,即只在其定义的源文件内有效,在同一源程序的其他源程序中不能使用它。由于由于静态全局变量的作用域值局限在一个源文件内,只能为该源文件内的函数公用,因此可以避免在其他原文件内引起错误。

       static全局变量只初始化一次,这是为了防止它在其他文件单元中被引用。

2.static局部变量和普通局部变量的区别:

       把局部变量改为静态局部变量以后,是改变了他的存储方式,即改变了它的生存周期。把全局变量改为静态全局变量是改变了它的作用域,限制了它的使用范围。

      static局部变量只初始化一次,下次的运算依据依然是上一次的结果值。

3. static函数和普通函数的区别:

       作用域不一样,static()函数只在一个源文件内有效,不能被其他源文件使用。

       只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源文件内进行说明和定义。

4.static的三个重要作用,首先static最重要的作用是隐藏,其次因为static变量存放在静态存储区,所以他具有持久性和默认性。

(1)隐藏

//static_main.c
#include<stdio.h>

void main(void)
{
    extern char  i;//extern variable  must be declared  before use
    printf("%c",i);
    msg();
    return 0;
}

//static_extern.c

char i='A';  //global variable
void msg()
{
    printf("I miss you !");
}

编译运行:

    如上图所示,为什么在 static——extern.c中定义的全局变量 i 和函数 msg 能在static_main.c中使用呢?

  当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,i 是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件static_main.c是可见的。 如果加了static,就会对其他源文件隐藏。例如在i和msg的定义前加上static,static_main.c就看不到它们了。 利用中这一特性可以在不同文件中定义同名函数和同名变量,而不必担心命名冲突。static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏。

(2)保持变量内容的持久。

          存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。 共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。

(3)默认初始化为0。

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

静态数据成员的特点:

1.对于非静态数据成员,每个类都有自己的复制品。而静态数据成员被当做类的成员。无论这个类的对象被定义了多少个,静态成员在程序中也只有一份复制品,由该类型的所有对象共享访问。

2.静态数据成员存储在全部存储区。定义时要分配空间,所以不能在类声明里定义。由于静态数据成员属于本类的所有对象共享,所以不属于特殊的类对象,在没有产生类对象时,其作用域就可见,即在没有产生类的实例时,程序员也可以使用它。

3.静态数据成员也遵从public,protect,private访问规则。

4.static成员变量的初始化在类外,此时不能再带上static的关键字。private、protect的static成员虽然也可以在类外初始化,但是不能再类外被访问。

静态数据成员的优势:

1.静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其他全局名字冲突的可能性。

2.可以实现信息隐藏。静态数据成员可以使private成员,但是全局变量不能。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值