静态变量--加static关键字的变量,特点:

(1)在全局数据区中分配内存,每次对其值得修改都会保留结果,直至程序结束。

(2)若静态变量没显示初始化,那会被自动初始化为0,并且只能初始化一遍。

1、全局变量:

在全局数据区中分配内存,每次值得修改都会保留结果。有全局作用域,并且有外部链接性,也就是不仅是所在文件,工程内的其他文件也可以用extern来使用同个工程内其他文件里面定义的变量。例如下面的例子:

代码1:

#include <iostream>
using namespace std;

static int a = 10;
int b = 6;

代码2:

#include <iostream>
using namespace std;

int main()
{
	extern int b;
	cout << b << endl;
	return 0;
}

代码1和2是在同一个工程的,然后对工程进行编译运行,得到输出结果为6:

说明在代码1定义的全局变量:int b = 6;在代码2中通过关键字extern使用:extern int b; 然后在代码2中就能使用b=6的值了。也就是extern关键字表明:此变量/函数是在别处定义的,要在此处引用。

2、静态全局变量:

与全局变量相比也具有全局作用域特性以及全局数据区中分配内存特性。

全局变量和全局静态变量的区别:

a)全局变量是不显式用static修饰的全局变量,全局变量默认是有外部链接性的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,就可以使用全局变量。

b)全局静态变量是显式用static修饰的全局变量,作用域是声明此变量所在的文件,其他的文件即使用extern声明也不能使用

3、静态局部变量:

使用价值:需要再两次函数调用之间对变量的值进行保存时。

特点:

(1)(2)继承上面静态变量的特点,即全局数据区分配内存+只在第一遍执行声明时进行初始化。

(3)同时有局部变量的特点,也就是只能为所在函数所使用(作用域为局部)。

示例代码:

#include <iostream>
using namespace std;

static int a = 10;
int b = 6;

void p()
{
	static int count = 1;
	count++;
	cout << "count "<<count << endl;
	a++;
	b++;
	cout << "a "<<a <<" b "<<b<< endl;
}

int main()
{
	a++;
	cout << "a "<<a << endl;
	p();
	p();

	return 0;
}

静态变量static和extern外引用的更多相关文章

  1. 静态变量(static)的特点

    静态变量(static):有局部变量,也有全局变量. 静态局部变量:在函数体内用static说明的变量称为静态局部变量,属于静态类别. 特点: (1)它占据一个永久性的存储单元.随着文件的存在而存在. ...

  2. java中的静态变量---static

    用static修饰符修饰的数据成员,并不是属于那个对象的,而是属于类.静态数据成员在定义的时候已经分配了内存,而此时对象还没有建立好. 当然它也是被保存到类的方法中的,而不是对象内存中,大家都是可以访 ...

  3. android中少用静态变量(android静态变量static生命周期)

    在android中,要少用静态变量. 我现在做的一个应用中,之前的开发人员使用静态变量来存储cookie,这个全局的静态变量用来验证身份. 这时客户反应,应用长时间不使用,再次使用,会提示身份过期. ...

  4. 静态变量static

    1.在我们平时些程序中我们经常需要一些变量的他们能纪录我们所需要的值,但是平常的int类型达不到这样的目的,所以呢就有了static的基态变量,静态变量就像  B/S中的session,cookio等 ...

  5. swift -- 静态变量static

    import UIKit class ViewController: UIViewController {     //静态变量  swift中的static静态变量,只能在这里声明,不能在方法中声明 ...

  6. Java中的静态变量static

    package com.wangcf; public class Test { String name="你好"; static String sex="男"; ...

  7. php静态变量static

    静态变量 function test() { static $a = 0; echo $a; $a++; } test(); test(); test();

  8. C#中为什么不能再方法里定义静态变量(Static)

    c#的静态变量是在对象生成的时候分配内存空间的,而不是函数执行的时候. 如果在函数里定义,那么这个变量就需要在函数执行的时候分配内存空间,这是C#不允许的,至于为什么不允许,个是因为垃圾回收机制的问题 ...

  9. SpringBoot项目给静态变量static注入@Value

    @value不能直接注入值给静态属性,spring 不允许/不支持把值注入到静态变量中:spring支持set方法注入,我们可以利用非静态setter 方法注入静态变量 @Component publ ...

随机推荐

  1. Fibers in JVM

    转载: Fibers in JVM

  2. laravel 安装完成后安装 vendor 目录

    composer  install 就是将composer.js 中的配置下载安装 生成vendor目录

  3. Sprint1(第七天11.20)

    Sprint1(11.20)   Sprint1第一阶段 1.类名:软件工程-第一阶段 2.时间:11.14-11.23 3.选题内容:web版-餐厅到店点餐系统 4.我们详细分析了点餐系统实现的具体 ...

  4. D​e​p​l​o​y​m​e​n​t​ ​f​a​i​l​u​r​e​ ​o​n​ ​T​o​m​c​a​t​ ​6​.​x​.​ ​C​o​u​l​d​ ​n​o​t​ ​c​o​p​y​ ​a​l​l​ ​r​e​s​o​u​r​c​e​s​ ​t​o

    在myeclipse总部署项目,一直有问题,提示如下的错误,经过研究在网上需求帮助,解决方案如下: Deployment failure on Tomcat  6.x. Could not copy  ...

  5. Wind7外接显示器选择拓展模式后,鼠标只能往右移动才能切换到外接显示器上,不能修改切换方向

    win7外接显示器选择拓展模式后,为什么鼠标只能往右移动才能切换到外接显示器上,不能修改切换方向 打开控制面板-->显示 其他不变的情况下,鼠标拖动上面的两个显示器图标,拉出你希望的方向即可.

  6. ACCESS中计算日均值

    如图所示,现有时间数据的时间字段是精确到时分秒的,现在需要计算PM2.5的日平均值,因此在查询时需要过滤时间字段的格式,去掉时分秒部分,只提取年月日部分. 查找资料,发现一般用CONVERT()函数实 ...

  7. CSS3学习之分享下transition属性

    最近在网上看到很多transition写的效果,借鉴http://www.w3school.com.cn分享下代码, 1.语法:transition: property duration timing ...

  8. 使用MLeaksFinder检测项目内存泄露总结

    前几天看到开源工具MLeaksFinder,决定用在公司的项目中试一下,效果很不错,用法也很简单,直接把项目文件夹拖到项目中就可以了,依靠这个项目,我发现公司项目中有不少内存泄露的地方,在此总结一下: ...

  9. 十天学会DIV+CSS(DIV布局)

    一列布局: 一列固定宽度.一列固定宽度居中.一列自适应宽度.一列自适应宽度居中 一列固定宽度 <head> <style type="text/css"> ...

  10. Rigid motion segmentation

    In computer vision, rigid motion segmentation is the process of separating regions, features, or tra ...