概述
在c和c++中所有数据都有两种类型。
1.一种是数据类型,如我们经常使用到的 int float double 等。我们在这并不讨论这种类型,当然也没有必要去那么做
2.另一种就是存储类型。其实我们在定义一个变量时,都是有前缀的,不过我们平时并不怎么关心它。总共有四种存储类型的变量,分别为自动变量(auto)、静态变量 (static)、外部变量(extern)以及寄存器变量(register)。
1.auto - 函数中所有的非静态局部变量。
在默认情况下,在代码块和函数头部定义的任意变量都属于自动变量。
void testAuto()
{
//在c++中进行了优化,不能这样写 auto int i=0
//它的自动在于,程序进入包含变量声明的代码块时,变量开始存在
//当程序离开这个代码块,变量消失
auto i = 0;
int j=0;//两者等效,我们一般习惯省去了auto
}
2.register -寄存器变量
一般经常被使用的的变量(如某一变量需要计算几千次)可以设 置成寄存器变量,register 变量会被存储在寄存器中,计算速度远快于存在内存 中的非 register 变量。
void testRegister()
{
//cpu如果需要使用某个数据多次,我们都知道cpu
//从内存中读数据很慢。寄存器变量,变量存放到
//寄存器中,可以大大的提到cpu读取数据的速度
register int i = 0;
for (i; i++; i < 100000)
{
//todo
}
}
注:
1.在c++中register进行了优化,我们可以不声明一个变量为寄存器变量,但当我们可能需要使用其很多次,编译器会自动进行优化,将其升级为寄存器变量。
2.在c语言中寄存器变量不可以取地址,因为其并不在内存中,但是在c++中当我们取地址时,编译器会自动将寄存器变量降为普通变量,既可以取地址。
3.寄存器变量不能定义为全局变量。
3.static-静态变量 在变量前加上 static 关键字的变量。
被声明为静态变量类型的变量,无论是局部还是全局的,都存在数据区中,其生命周期是整个程序。区别在于访问权限不一样。
//如果声明为全局静态变量
static int j = 0;
void testStatic()
{
//则在这个文件中,自声明之后任何地方都可以访问其
//和全局变量效果一样
printf("%d\n", ++j);
for(int k=0;k<10;k++)
{
static int i = 0;
++i;
printf("%d\n", i);//这个变量只会被声明一次
//也就是无论循环执行多少次输出结果会一直递增1
}
//如果声明为局部的,虽然i这个变量一直存在
//但是只能在其声明的代码块中访问它,
//++i;
}
4.extern-外部变量
把全局变量在其他源文件中声明成 extern 变量,可以扩展该全局变 量的作用域至声明的那个文件,其本质作用就是对全局变量作用域的扩展。
全局变量:作用域从定义的哪一行开始,到文件最后一行,但是终究只是在所在源文件中。
//extern.cpp
#include<iostream>
int extern_vule = 8888;
//main.cpp
void testExtern()
{
extern int extern_vule;
extern_vule++;
printf("%d\n", extern_vule);
}
注:
在extern.cpp中声明定义了 extern_vule,在main.cpp中想使用这个变量,我们需要声明extern int extern_vule;
但是不能再给这个变量赋值。
在extern.cpp中定义的extern_vule必须是全局变量才可以用extern,进而被其他文件访问到。