C++语言变量的存储类别

1.1 概述

存储类别是变量的属性之一。在我们定义一个变量时,其实是有前缀的,只是我们通常省略。C++语言有4中变量的存储类别,分别是auto变量、static变量、register变量、extern变量。不同的变量存储方式会使变量的生存期不同,生存期表示了变量存在的时间。生存期和变量作用域是从时间和空间这两个不同的角度来描述变量的特性。在介绍4种变量之前,我们需要搞清楚动态变量和静态变量是什么。


1.2 静态变量与动态变量

静态存储变量通常是在变量定义时就分配固定的存储单元并一直不变,直到整个程序结束。全局变量就属于静态存储变量,它们被分配在静态存储区中。

动态存储变量是在程序执行过程中使用它时才分配存储单元,只是在函数被调用时才给予分配,调用函数完毕后立即释放,此类变量被分配在动态存储区中。

总结:静态变量一直存在,直到程序结束;动态变量时而存在时而消失。


2.1 auto变量

自动变量存储类型是C++语言程序中默认的存储类型。声明定义自动变量时,可以将auto关键字省略。

int i;同等于auto int i;

自动变量具有以下特点:

//程序1
//1.自动变量的作用域仅限于定义该变量的个体内。在函数体定义的自动变量,只在该函数内有效,在复合语句中定义的自动变量只在改复合语句中有效;
//2.不加前缀的变量,会自动视为auto自动变量;
//3.自动变量属于自动存储方式,变量分配的内存实在栈中,当函数调用结束后,自动变量的值会自动被释放[注意]。同样,在复合语句中定义的自动变量,在退出复合语句后也不能再使用,否则会引起错误;
//4.由于自动变量的作用域和生存期都局限与它的个体内(函数或复合语句),因此不同的个体中允许使用同名的变量而不会混淆。[程序2]
#include <stdio.h>
int main()
{
	auto int i(1),j(3),k(2);//auto可以省略 
	printf("%d %d %d",i,j,k);
	return 0;
}

int Show()//自动变量的作用域仅限于定义该变量的个体内
{
	auto int x,y;//在函数体定义的自动变量,只在该函数内有效
	if(1)
	{
		auto c;//在复合语句中定义的自动变量只在改复合语句中有效
		cout<<c;//正确
		cout<<x;//正确 
	} 
	cout<<c;//错误
	cout<<x;//正确 
}
cout<<c;//错误
cout<<x;//错误
//程序2:输出不同生存期的值 
#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
	auto int i,j,k;//函数内的k
	cin>>i>>j;
	k=i+j;
	if(i!=0 && j!=0)
	{
		auto int k;//复合语句中的k
		k=i-j;
		cout<<"k:"<<k<<endl;//输出复合语句中的k的值 
	}
	cout<<"k:"<<k<<endl;//输出函数内的k的值 
	return 0;
}//虽然变量名都是k,但其实是两个不同的变量 

2.2 static变量

在声明变量前加关键字static,可以将变量声明为静态变量。

static int a,b;
static float c,d;
static int x[5]={0,1,2,3,4};

静态变量属于静态存储方式,它具有以下特点:

//1.静态变量在函数内定义,在程序结束后释放。也就是说它的生存期为整个源程序;
//2.与auto自动变量的作用域相同,在函数内定义就在函数内使用。尽管该变量还继续存在,但不能使用它;
//3.编译器会为静态局部变量初始化为0;
//4.静态局部变量的值在函数调用结束后不消失,静态全局变量只在本源文件使用。
//使用static变量实现累加 
#include <stdio.h>
#include <iostream>
using namespace std;
int add(int x)
{
	static int n;//不需要初始化<第三条> 
	n=n+x;//利用static变量的特性<第二条;第四条> 
	return n;
}
int main()
{
	auto int i,j,s;
	cin>>i;
	cout<<"The result is:"<<endl;
	for(j=1;j<=i;j++)
	{
		s=add(j);
		cout<<j<<":"<<s<<endl;
	}
	return 0;
}

2.3 register变量

通常变量的值存放在内存中,当对一个变量反复读写时,需要反复访问内存储器,则花费了大量存取时间。为了提高效率,C++语言可以将变量声明为寄存器变量,这种变量将局部变量的值存放在CPU的寄存器中,使用时不需要访问内存,而直接从寄存器中读写。register就是寄存器变量

register变量具有以下特点:

//1.寄存器变量属于动态存储方式。凡需要采用静态存储方式的量不能定义为寄存器变量;
//2.编译程序会自动决定哪个变量需要存储器存储。register起到程序优化的作用; 
//3.register不会初始化为0。 
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
	register int a,b,c;
	cout<<a<<" "<<b<<" "<<c;
	return 0;
} 

2.4 extern变量

在一个源文件中定义的变量和函数只能被本文件中的函数调用,一个C++语言程序中会有许多源文件,如果使用非源文件的全局变量呢?

C++语言提供了extern关键字来解决这个问题。在使用其他源文件的全局变量时,只需要在本源文件中使用extern关键字来声明这个变量即可。

//主程序
//1.extern最大的特点是能访问非本源文件的全局变量。 
#include <stdio.h>
#include <iostream>
#include "extern_test.h"//调用 
using namespace std;
extern int a,b;//声明外部变量,声明而不定义,且不能包含初值,系统不会为此变量分配内存空间
extern char c;//声明外部变量 ,声明而不定义,且不能包含初值,系统不会为此变量分配内存空间
int main()
{
	cout<<a<<endl;
	cout<<b<<endl;
	cout<<c<<endl;//其实把7、8行去掉也能运行成功 
	return 0;
}
//extern_test.h中的内容
#pragma once
int a=3,b=6;
char c='A';

2.5 小结

不同的变量存储类别会有不同的作用,在程序设计的时候要慎重选择变量存储类别。使用正确的变量存储类别,有时能起到事半功倍的效果。

猜你喜欢

转载自blog.csdn.net/apro1066/article/details/81048040