C++学习之:变量的存储类别

在c++中,每个变量有两个属性:

  1. 类型:变量所存储的数据类型(如int、double、char);
  2. 存储类型:变量所存储的区域(atuo、register、extern、static)

变量的作用域决定了变量的有效范围。变量的存储类别决定了变量的生存期限。在计算机中,内存被分成不同的区域。不同区域与不同的用途。按变量在计算机内的存储位置来分,变量分为:自动变量(atuo)、静态变量(static)、寄存器变量(register)、和外部变量(extern)。变量的存储位置称为变量的存储类别。c++中完整的变量定义格式为:

存储类别 数据类型 变量名;

1.寄存器变量(register)

存储在寄存器中,代替自动变量或形参,可以提高变量的访问速度。

register int x;//表示x不是存储在内存中,而是存储在寄存器中
2.外部变量(extern)

外部变量一定是全局变量。全局变量的作用域是从变量定义处到文件结束。如果在定义点以前的函数或另一源文件中的函数也要使用该全局变量,则在引用之前,应该对此全局变量用关键字extern进行外部变量声明,否则编译器会认为使用了一个没有定义过的变量。

//file1.cpp
#include <iostream>
using namespace std;

void f();
extern int x; //外部变量的声明

int main()
{  
   f();
   cout << "in main(): x= “
           << x << endl;
   return 0;
}

//file2.cpp
#include <iostream>
using namespace std;

int x; //全局变量的定义

void f()
 { 
    cout << "in f(): x= “
             << x << endl;
} 
#include <iostream>
using namespace std;
void f();

int main()
{
    extern int x;
    f();
    cout << "in main(): x= " << x << endl;
    return 0;
}

int x;

void f()
{
    cout << "in f(): x= " << x << endl;
} 

用途:

  1. 在某一函数中应用了一个声明在本函数后的全局变量时,需要在函数内用extern声明此全局变量。
  2. 当一个程序有多个源文件组成时,用extern可引用另一个文件中的全局变量。

3.自动变量(atuo)

函数中的局部变量、形参或程序块中定义的变量,如不专门声明为其他存储类型,都是自动变量。不指名存储类型的定义都是指自动变量类型的存储类型。如下面两个定义是等价的:

auto int a,b;
//等价于:
int a,b;

自动变量存储在内存中的区域中。

4.静态变量

如果程序执行过程中某些变量自始至终都必须存在,如全局变量,那么这些变量被存储在内存的全局变量区,如果想限制这些变量只在某一个范围内才能使用,用static来限定。存储类别指定为static的变量称为静态变量。局部变量和全局变量都可以定义为静态的。

     4.1静态的全局变量

    如果在一个源文件的头上定义了一个全局变量,则该源文件中的所有函数都能使用该全局变量。事实上该程序中的其他源文件中的函数也能使用该全局变量。但在一个结构良好的程序中,一般是不希望多个源文件共享某一个全局变量。要做到这一点可以使用静态的全局变量。比如在定义全局变量前加上关键字static。如:

static int x;//表示该全局变量是当前源文件私有的,只有本源文件中的函数才可以引用它,其他源文件中的函数是不能引用它的

  • 用static说明的全局变量,其他源文件不能用extern引用它,因为它只供本源文件使用。
  • 用extern还可以用在函数定义或说明中,该函数只能被用于本源文件中,其他源文件不能调用此函数
//file1.cpp
#include <iostream>
using namespace std;

void f();
extern int x;     //出错,因为static int x 只能在file2.cpp中使用

int main()
{  
   f();
   cout << "in main(): x= “
           << x << endl;
   return 0;
}

//file2.cpp
#include <iostream>
using namespace std;

static  int  x; 

void f()
 { 
    cout << "in f(): x= “
             << x << endl;
} 

    4.2 静态的局部变量

如果把一个局部变量定义为static,该变量就不再存放在函数对应的帧中,而是存放在全局变量区。当函数执行结束后,该变量不会消失,在下一次调用该函数时,也不会再创建该变量,而是继续使用原空间中的值。这样就可以把上一次函数调用的某些信息带到下一次函数调用中。

  • 第一次调用函数时定义
  • 函数执行结束时消亡
  • 再次调用函数时不再重新定义,继续沿用原有空间
int f(int a)
     {   int b=0;
          static int c=3;
          b=b+1; 
          c=c+1;
          return(a+b+c);
      }
      int main()
      {  int a=2,i;
          for (i=0; i<3; ++i)
             cout << f(a);//运算结果为7、8、9
          return 0;
      }

总结:静态变量使用时必须注意四点:

  • 未被程序员初始化的静态变量都由系统初始化为0。
  • 局部静态变量的初值是编译赋的,当运行时重复调用该函数时,由于没有重新分配空间,因此也不做初始化。
  • 虽然局部静态变量在函数调用结束后仍然存在,但其他函数不能引用它
  • 局部的静态变量在程序执行结束后消亡。如果程序中既有静态的局部变量又有全局变量,系统先消亡静态的局部变量,再消亡全局变量。

补充:全局变量与局部变量

全局变量和局部变量的作用范围:从定义位置后的函数都能使用此变量

1.局部变量

    在块内定义的变量称为局部变量,即使是main函数中定义的变量也是局部变量。当外部块与内部块有共同标识符时,在内部块中屏蔽外部块的同名标识符。

2.全局变量

在所有函数外边(包括main函数)定义的变量称为全局变量。全局变量被保存在一个在整个程序执行期间始终有效的独立内存区域,永远都不会被包含局部变量的帧覆盖。程序中每个函数都可以看到,并操作这块独立区域上的这些变量。全局变量的作用域是源文件中定义它的位置后的其余部分。

全局变量增加了函数间的联系渠道。由于同一源文件中的所有函数都能引用全局变量,因此,当一个函数改变了某个全局变量的值,其他的函数都能看见。

在局部变量与全局变量

比如下面的示例程序

int  p = 1,  q = 5, r=3; //全局变量
int f1()
{ int p = 3,  r = 2;
  q=p+q+r;  cout << “f1: p,q,r=“ << p << q << r; //函数f1操作了全局变量q
}
int f2()
{
  p=p+q+r;  cout << “f2: p,q,r=“ << p << q << r;
}
int f3()
{ int q;    r = 2*r;  q=r+p;
  cout << “f3: p,q,r=“ << p << q << r;
}
int main()
{ f3(); cout << “after f3: p,q,r=” << p << q < r;
  f1(); cout << “after f1: p,q,r=“  << p << q << r;
  f2(); cout << “after f2: p,q,r=” << p << q << r;
  return 0;
 } 
运算结果:
f3:p,q,r=1 7 6
after f3: p,q,r=1 5 6 
f1: p,q,r=3 10 2 
after f1:p,q,r=1 10 6 
f2: p,q,r=17 10 6 
after f2: p,q,r=17 10 6 



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值