深入static的用途?

来自中兴笔试题目:

static的用途?

1.隐藏:把变量的可见范围限制在编译单元中,使它成为一个内部连接;

2.静态存储:使得变量或对象的存储形式变成静态存储;

3.初始化为0

4.类中的static成员

(1)隐藏(即限定作用域):全局变量和函数

同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。

被staitc修饰的全局变量或函数都被编译器标记为仅在本文件中使用,由于编译器在编译过程中是以.c结尾的源文件为单位依次生成以.o结尾的目标文件,所以最后连接器在连接过程中将不允许被static修饰的变量或函数的地址对外链接。这样既可以防止全局变量或函数的重名问题,又可以防止由于无关的全局变量误操作引起的程序逻辑问题。因此static就限定了变量或函数的作用域。

我们要同时编译两个源文件,一个是a.c,另一个是main.c.

  下面是a.c的内容


  char a = 'A'; // global variable,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问
                             //所以,另外的源文件main.c是可见的。

  void msg()


  {


  printf("Hello\n");


  }


  下面是main.c的内容


  int main(void)


  {


  extern char a; // extern variable must be declared before use


  printf("%c ", a);


  (void)msg();


  return 0;


  }


  程序的运行结果是:


  A Hello

如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。

利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。

Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。

(2)static的第二个作用是保持变量内容的持久。局部变量

一般情况下,对于局部变量是存放在栈区的,并且局部变量的生命周期在该语句块执行结束时便结束了。

但是如果用static进行修饰的话,该变量便存放在静态数据区,其生命周期一直持续到整个程序执行结束。

 存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化

共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。

#include

  int fun(void){


  static int count = 10; // 事实上此赋值语句从来没有执行过


  return count--;


  }


  int count = 1;


  int main(void)


  {


  printf("global\t\tlocal static\n");


  for(; count <= 10; ++count)


  printf("%d\t\t%d\n", count, fun());


  return 0;


  }


  程序的运行结果是:


  global local static


  1 10


  2 9


  3 8


  4 7


  5 6


  6 5


  7 4


  8 3


  9 2


  10 1
(3)static的第三个作用是默认初始化为0.其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,可以减少程序员的工作量。
#include<stdio.h>
int a;
int main(void)
{
 static char str[10];
printf("a: %d; str: %s", a, str);
return 0;
}

运行结果:

  

去掉static修饰后:

#include<stdio.h>
int a;
int main(void)
{
char str[10];//去掉static,str为随机值
printf("a: %d; str: %s", a, str);
return 0;
}

运行结果:


总结:首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0.

以上原文出自【比特网】,转载请保留原文链接:http://soft.chinabyte.com/database/384/12075884.shtml
(4)C++中的static
static进行修饰类的成员函数:

  1.则表示该函数属于一个类而不是属于此类的任何特定对象;

  2.只能访问静态成员函数和静态成员变量,不能访问非静态成员函数或者变量。

static修饰类的成员变量:

1.表示该变量为类以及其所有的对象所有。

二者共同点:在存储空间中都只存在一个副本; 可以通过类和对象去调用

详细出处参考:http://www.jb51.net/article/37336.htm




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值