✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343
📚专栏地址:C/C++知识点
📣专栏定位:整理一下 C++ 相关的知识点,供大家学习参考~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
🎏唠叨唠叨:在这个专栏里我会整理一些琐碎的 C++ 知识点,方便大家作为字典查询~
变量的4种存储类型
存储类用于定义C++程序中变量和函数的生命周期和可见性。
寿命是指变量保持活动的时间段,可见性是指可访问变量的程序的模块。
有五种类型的存储类,可以在C++程序中使用:
- 自动(Automatic)
- 寄存器(Register)
- 静态(Static)
- 外部(External)
- 可变(Mutable)
数据类型
- 数据类型: 如 int ,float 等。
- 存储类型: 总共有四种存储类型的变量,分别为自动变量(auto)、静态变量(static)、外部变量(extern)以及寄存器变量(register)。
-
auto - 函数中所有的非静态局部变量。
auto是所有局部变量的默认存储类。
auto关键字自动应用于所有局部变量。
{ auto int v1; float v2 = 99.1; }
上面的例子定义了两个具有相同存储类的变量,auto只能在函数中使用。
-
register - 一般经常被使用的的变量(如某一变量需要计算几千次)可以设置成寄存器变量,register 变量会被存储在寄存器中,计算速度远快于存在内存中的非 register 变量。
寄存器变量在寄存器中分配存储器而不是RAM。 其大小与寄存器大小相同。 它比其他变量具有更快的访问速度。
建议仅使用寄存器变量进行快速访问!
ex:在计数器中。
register int count=0;
注意:不能得到寄存器变量的地址。
-
static - 在变量前加上 static 关键字的变量,它只会定义一次,以后反复定义这个变量都是使用同一个。
静态变量只初始化一次,直到程序结束。
它保留可在多个函数之间调用的值。
静态变量由编译器提供的一个默认值:0。
void func() { static int v1=0; //static variable int v2=0; //local variable v1++; v2++; cout<<"v1=" << v1<<" v2=" <<v2<<endl; }
调用上面的func()会发现每次调用v1的值都会增加,而v2的值不会变。
-
extern - 把全局变量在其他源文件中声明成 extern 变量,可以扩展该全局变量的作用域至声明的那个文件,其本质作用就是对全局变量作用域的扩展。
extern变量对所有程序都可见。
如果两个或多个文件共享相同的变量或函数,则使用它。
extern int v1 = 0;
-
externDemo.cpp
#include<stdlib.h>
int extern_value = 10;
main.cpp
#include<stdlib.h>
#include<iostream>
using namespace std;
extern int extern_value; //从externDemo.cpp中取过来
static int p1 = 24;//全局静态变量
//寄存器变量
void register_demo() {
register int j = 0; //不能在全局定义
printf("register_demo:j=%d ", j);
//register可以不用再用,是C遗留下来的
//C++的register关键字已经优化,可以不用去申明
//如果我们打印它的地址,它就变成了普通的auto变量
printf("&j:0x%p\n", &j);
}
//静态局部变量量
void static_demo() {
static int p2 = 23;
int p3 = 23;
p2++, p3++;
//每次调用这个函数p2都会在上次的值的基础上加1,而p3只会等于24
printf("static_demo:p2=%d p3=%d\n", p2, p3);
}
//外部变量
void extern_demo() {
extern_value++;
printf("extern_demo:extern_value=%d\n", extern_value);
}
int main()
{
auto i = 0; //自动变量,自动定义为整数变量
register_demo();
static_demo();
static_demo();
static_demo();
extern_demo();
return 0;
}