本文主要是介绍4、变量与静态变量,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
变量与静态变量
- 1、多个文件共享——全局变量+extern
- 2、单个文件中的函数共享——static修饰的静态全局变量
- 3、函数私有——局部变量和static静态局部变量
- (1)局部变量
- (2)static静态局部变量
- 4、存储分布与存储期限
关键字 | 作用 |
---|---|
extern | 不改变作用域和生存期,只是用于声明该变量在其它文件中定义,使其在当前文件中可见,只能修饰全局的变量 |
static | 不改变作用域,修饰全局变量时,使其对其他文件不可见,作用域限制在本文件 ;修饰局部变量时,生存期从程序开始到程序结束 ,即使函数或代码块退出,静态局部变量也不会被销毁,而是保留其值 |
const | 不改变作用域和生存期,用于声明全局或局部常量,表明该值不可修改 |
1、多个文件共享——全局变量+extern
// add.cpp
#include "add.h"
int NUM1 = 5; // 对其他文件可见的全局变量,可以通过在其他文件中extern声明使用它
int NUM2 = 3;
int add() { return NUM1 + NUM2; }// main.cpp
#include <iostream>
#include "add.h"
using namespace std;
extern int NUM1;// 加extern,使用全局变量
extern int NUM2;
int main() {cout << NUM1 << " + " << NUM2 << " = " << add() << endl;return 0;
}
2、单个文件中的函数共享——static修饰的静态全局变量
// add.cpp对应部分修改为
static int NUM1 = 5; // 对其他文件不可见的static全局变量,只允许本文件使用,不可通过extern在其他文件中使用
static int NUM2 = 3;
static全局变量只允许本文件使用,对其他文件不可见,所以使用extern声明,仍然会出现未定义错误。
3、函数私有——局部变量和static静态局部变量
(1)局部变量
#include <iostream>
using namespace std;
void foo() {int count = 0; // 局部变量,离开作用域销毁count++;cout << count << endl;
}
int main() {foo(); // 输出:1foo(); // 输出:1foo(); // 输出:1return 0;
}
(2)static静态局部变量
#include <iostream>
using namespace std;
void foo() {static int count = 0; // 静态局部变量,离开作用域仍然保存值,静态局部变量在程序第一次执行到该变量定义处时进行初始化,以后每次调用该函数时不会重新初始化。count++;cout << count << endl;
}
int main() {foo(); // 输出:1foo(); // 输出:2foo(); // 输出:3// cout << count << endl; // 错误,静态局部变量count作用域仍是foo函数,不过生存期为整个程序运行期间return 0;
}
4、存储分布与存储期限
自动存储期限
:存放在栈区
的数据具有自动存储期限,生命周期随栈帧入栈开始,出栈结束。静态存储期限
:数据拥有永久的存储单元
,在程序整个执行期间都存在
。程序员管理
:存放在堆
上的数据,存储期限由程序员指定,看程序员合适释放。
#include <iostream>
using namespace std;
int a = 0;
static int b = 0;
const int c = 0;
static const int d = 0;
void foo() {static int e = 0;static const int f = 0;int g = 0;const int h = 0;cout << "静态局部变量e: " << hex << &e << endl;cout << "静态局部常量f: " << hex << &f << endl;cout << "局部变量 g: " << hex << &g << endl;cout << "局部常量 h: " << hex << &h << endl;
}
int main() {cout << "全局变量 a: " << hex << &a << endl;cout << "静态全局变量b: " << hex << &b << endl;cout << "全局常量 c: " << hex << &c << endl;cout << "静态全局常量d: " << hex << &d << endl;foo();return 0;
}
我们可以看到全局变量和静态变量在内存上很接近
,这说明它们同属一片内存区域,具有静态存储期限。局部变量位于另一区域
,具有自动存储期限。所以在局部变量前加static关键字,它的存储周期变为静态存储期限,在程序整个执行期间都存在。
这篇关于4、变量与静态变量的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!