静态变量static和extern外引用
静态变量--加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外引用的更多相关文章
- 静态变量(static)的特点
		
静态变量(static):有局部变量,也有全局变量. 静态局部变量:在函数体内用static说明的变量称为静态局部变量,属于静态类别. 特点: (1)它占据一个永久性的存储单元.随着文件的存在而存在. ...
 - java中的静态变量---static
		
用static修饰符修饰的数据成员,并不是属于那个对象的,而是属于类.静态数据成员在定义的时候已经分配了内存,而此时对象还没有建立好. 当然它也是被保存到类的方法中的,而不是对象内存中,大家都是可以访 ...
 - android中少用静态变量(android静态变量static生命周期)
		
在android中,要少用静态变量. 我现在做的一个应用中,之前的开发人员使用静态变量来存储cookie,这个全局的静态变量用来验证身份. 这时客户反应,应用长时间不使用,再次使用,会提示身份过期. ...
 - 静态变量static
		
1.在我们平时些程序中我们经常需要一些变量的他们能纪录我们所需要的值,但是平常的int类型达不到这样的目的,所以呢就有了static的基态变量,静态变量就像 B/S中的session,cookio等 ...
 - swift -- 静态变量static
		
import UIKit class ViewController: UIViewController { //静态变量 swift中的static静态变量,只能在这里声明,不能在方法中声明 ...
 - Java中的静态变量static
		
package com.wangcf; public class Test { String name="你好"; static String sex="男"; ...
 - php静态变量static
		
静态变量 function test() { static $a = 0; echo $a; $a++; } test(); test(); test();
 - C#中为什么不能再方法里定义静态变量(Static)
		
c#的静态变量是在对象生成的时候分配内存空间的,而不是函数执行的时候. 如果在函数里定义,那么这个变量就需要在函数执行的时候分配内存空间,这是C#不允许的,至于为什么不允许,个是因为垃圾回收机制的问题 ...
 - SpringBoot项目给静态变量static注入@Value
		
@value不能直接注入值给静态属性,spring 不允许/不支持把值注入到静态变量中:spring支持set方法注入,我们可以利用非静态setter 方法注入静态变量 @Component publ ...
 
随机推荐
- LD_LIBRARY_PATH的设定
			
LD_LIBRARY_PATH的设定 变量LD_LIBRARY_PATH 是用来在Linux下设置动态链接库(*.so)的查找路径,我们一般情况下都需要在运行一个带有动态链接库的程序是运行 exp ...
 - sqoop、flume 安装
			
sqoop安装步骤 1.上传解压tar包 tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz 2.修改配置文件 进入 sqoop/conf/ c ...
 - mysql执行大量sql语句
			
今天需要通过csv上传大量数据到数据库 直接逐行执行insert效率极其低下 后面通过拼接insert,稍微提高了些许效率,但依然不满足 最后发现,把这些插入放入同一个事务里面可以大大提高效率 beg ...
 - OpenGL利用模板测试实现不规则裁剪
			
本文是原创文章,如需转载,请注明文章出处 在游戏开发中,经常会有这样的需求:给定一张64x64的卡牌素材,要求只显示以图片中心为圆点.直径为64的圆形区域,这就要用到模板测试来进行不规则裁剪. 实现不 ...
 - 【LeetCode】#344 Reverse String
			
[Question] Write a function that takes a string as input and returns the string reversed. Example: G ...
 - java中参数传递方式
			
在 Java 应用程序中永远不会传递对象,而只传递对象引用.因此是按引用传递对象.Java应用程序按引用传递对象这一事实并不意味着 Java 应用程序按引用传递参数.参数可以是对象引用,而 Java ...
 - js文件如何最后加载
			
总结一下,大概有三种方式 1.最简单粗暴的:将js文件放在最后写 2.window.onload当一个文档完全下载到浏览器中时,才会触发window.onload事件.这意味着页面上的全部元素对js而 ...
 - 深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)
			
上篇文章<深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)> 介绍了properties与environments, ...
 - JAVA求集合中的组合
			
好几个月没弄代码了,今天弄个求组合的DEMO 思路是将集合的每个值对照一个索引,索引大小是集合的大小+2.索引默认为[000...000],当组合后选取的组合值demo为[0100..00].然后根据 ...
 - EntityFramework CodeFirst SQLServer转Oracle踩坑笔记
			
接着在Oracle中使用Entity Framework 6 CodeFirst这篇博文,正在将项目从SQLServer 2012转至Oracle 11g,目前为止遇到的问题在此记录下. SQL Se ...