关键字static完全解析

在c语言中关键字static的意思是静态,它有三个明显的作用.

1).在函数体内,静态变量具有“记忆功能”,即一个变量被声明为静态变量,在函数下次被调用时仍保留上次调用该函数时该静态变量的值.

代码如下:

/*
	Name: 52coder
	Copyright: 52coder.net
	Author: 尘世中迷途小书童
	Date: 15/05/15 11:49
	Description:
*/
#include <stdio.h>
void fun()
{
	static int n=0;
	printf("%d\n",++n);
}
int main()
{
	for(int i=0;i<10;i++)
		fun();
	return 0;
}

运行结果:

静态全局变量有以下特点:

  • 该变量在全局数据区分配内存;
  • 未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化);
  • 静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的; 

静态变量都在全局数据区分配内存,包括静态局部变量。对于一个完整的程序,在内存中的分布情况如下图:

代码区
全局数据区
堆区
栈区

  一般程序的由new产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释放空间,静态数据,即使是函数内部的静态局部变量也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。

2、静态局部变量

在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量。

我们先举一个静态局部变量的例子,如下:

[cpp] view
plain
copy

  1. #include<iostream>
  2. using namespace std;
  3. void fn();
  4. int main(void)
  5. {
  6. fn();
  7. fn();
  8. fn();
  9. return 0;
  10. }
  11. void fn()
  12. {
  13. static int n = 10;
  14. cout<<n<<endl;
  15. n++;
  16. }

通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。

  但有时候我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。

  静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。

静态局部变量有以下特点:

(1)该变量在全局数据区分配内存;

(2)静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;

(3)静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;

(4)它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;

3、静态函数

  在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。

静态函数的例子:

[cpp] view
plain
copy

  1. #include<iostream>
  2. using namespace std;
  3. static void fn();   //声明静态函数
  4. int main(void)
  5. {
  6. fn();
  7. return 0;
  8. }
  9. void fn()     //定义静态函数
  10. {
  11. int n = 10;
  12. cout<<n<<endl;
  13. }

与全局变量相比,使用静态数据成员有以下两个优势:

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

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

static变量只能初始化一次。

代码如下:

#include <stdio.h>

void fun(int i)
{
	static int value=i++;
	printf("%d\n",value);
}
int main()
{
	fun(0);
	fun(1);
	fun(2);
	return 0;
}

程序输出为:

0

0

0

由于第一次调用函数fun()时i=0,所以value就初始化为0,以后再调用fun()都不会初始化value.

时间: 2024-10-13 01:38:01

关键字static完全解析的相关文章

C++关键字static解析总结

http://developer.51cto.com/art/201104/254141.htm(下文引用地址) 要理解static,就必须要先理解另一个与之相对的关键字,很多人可能都还不知道有这个关键字,那就是auto,其实我们通常声明的不用static修饰的变量,都是auto的,因为它是默认的,就象short和long总是默认为int一样:我们通常声明一个变量: int a; string s; 其实就是: auto int a; auto string s; 而static变量的声明是:

java关键字static

static修饰符可以修饰变量.常量.方法和代码块,分别称为静态变量.静态常量.静态方法和静态代码块. 1.static变量 在java中,如果希望某个变量的值能被所有的对象共享,可以将该变量声明为静态变量(也叫类变量).静态变量在类装载时,只分配一块储存空间,所有此类的对象都可以操控此块储存空间,它为所有类实例提供共享的变量.当一个对象将该变量修改后,其他对象再使用该变量将会是改变后的数据.声明静态变量的语法如下: [权限控制符] static 成员变量类型 成员变量名: 访问静态变量的语法如

Java关键字--static

在Java中,将关键字static分为三部分进行讨论,分别为Java静态变量.Java静态方法.Java静态类 Java Static Variables Java instance variables are given separate memory for storage. If there is a need for a variable to be common to all the objects of a single java class, then the static mod

关键字static

这个简单的问题很少有人能回答完全.在C语言中,关键字static有三个明显的作用: 1)在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(该变量存放在静态变量区). 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问.它是一个本地的全局变量. 3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用.那就是,这个函数被限制在声明它的模块的本地范围内使用. 大多数应试者能正确回答第一部分,一部分能正确回答第二部

java中的关键字static(静态变量)和final定义常量

1 package point; 2 3 class Point { 4 5 int x = 0; 6 int y = 0; 7 static int z = 100; // 定义静态变量z,类变量 8 static final double PI = 3.1415926;// final定义常量,它的值在运行时不能被改变 9 10 Point(int a, int b) { 11 //PI=3.1415926; 12 /* 13 * 当使用静态常量的时候,不能在构造函数中初始化, 因为静态时,

关键字static和const的作用

一.在C语言中,关键字static的作用: (1)设置变量的存储域,函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值: (2)限制变量的作用域,在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问: (3)限制函数的作用域,在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内:(4)在类中的static成员变量意味着它为该类的所有实例所共享,也

关键字static在c与c++中的区别。

关键字--static static主要有以下三个作用: 1. 局部静态变量(c/c++)2. 外部静态变量/函数(c/c++)3. 静态数据成员/成员函数 (c++特有)1.局部静态变量 静态局部变量,在函数里面定义的,就只能在这个函数里用了.由于被static修饰的变量只存在内存的静态区.所以即使函数运行结束,这个静态变量的值不会销毁,下次调用还能调用到这个值. 在C/C++中, 局部变量按照存储形式可分为三种auto, static, register. (1). 存储空间分配和生存周期不

c中常用的关键字static const volatile

在C语言中,关键字static有三个明显的作用:1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变.2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问.它是一个本地的全局变量.3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用.那就是,这个函数被限制在声明它的模块的本地范围内使用.大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分.这是一个应试者的严重的缺点,因

再回首之关键字static

在刚刚学习java时接触了static,如类中主方法public static void  main(String [] args),以前也是“不求甚解”,正所谓基础不牢地动山摇啊! 现在要对基础知识做一个深刻的理解 1.static关键字 static关键字用于修饰:属性.方法.内部类.代码块. static修饰的资源属于类级别,是全体对象的共享资源 1)static修饰的属性(静态属性/类属性) 根据上面的说法静态属性应该是该类全体对象的共享属性 如下代码 package com.shxt.