存储类别

对象:存储数据的一块内存称为对象,用存储期描述对象 

标识符:是一个名称,用来指定特定对象的内容.可以用作用域、链接来描述标识符 

不同的存储类别具有不同的存储期、作用域和链接
     
存储期:指对象在内存中保留了多长时间
作用域和链接:描述程序的那些部分可以使用它

作用域

  1. 块作用域:(块是一对花括号括起来的代码区域 )从定义处到包含该定义的块的末尾 
  2. 函数作用域:仅用于goto语句的标签。即使一个标签首次出现在函数的内层块中, 作用域延伸至整个函数 
  3. 函数原型作用域:用于函数原型中的形参名(变量名),从形参定义到原型声明结束 
  4. 文件作用域(文件作用域变量也称全局变量) :变量的定义在函数的外面,从它定义处到该定义所在文件的 结尾 

链接

  1. 外部链接:外部链接变量可以在多文件程序中使用 
  2. 内部链接:只能在一个翻译单元中使用 
  3. 无链接:具有块作用域、函数作用域或函数原型作用域的变量都是无链接变量。这意味着这些变量属于定义它们的块、函数或原型私有。

内部链接的文件作用域:描述一个仅限于一个翻译单元(一个源文件代码和它所包含的头文件)的作用域:简称文件作用域 
外部链接的文件作用域:描述可延伸到其他翻译单元的作用域 :简称全局作用域或程序作用域 

int count=3;		//文件作用域,外部链接 
static int tmp=2;		//文件作用域,内部链接

 存储期

静态存储期:程序的执行期间一直存在。文件作用域变量具有静态存储期。

线程存储期:用于并发程序设计,程序执行可被分为多个线程。具有线程
存储期的对象,从被声明时到线程结束一直存在。以关键字_Thread_local声
明一个对象时,每个线程都获得该变量的私有备份。

自动存储期:当程序进入定义这些变量的块
时,为这些变量分配内存;当退出这个块时,释放刚才为变量分配的内存。

动态分配存储期:通过malloc,calloc等方式分配的内存,通过调用free()等方法释放

存储类别

/*自动变量:具有自动存储期、块作用域、无链接、 
为了更清楚的表达你的意图(为了表明有意覆盖一个外部变量定义,或者强调不要把该变量改为其
他存储类别),可以显示使用关键字auto 
*/ 
/*外部存储类别:外部变量:具有静态存储区、文件作用域、外部链接
	外部变量的作用域:从声明处到文件结尾,程序运行中一直存在 
 */
int Errupt;		//外部定义的变量	
double Up[100];   //外部定义的数组 
extern char Coal;		//如果Coal被定义在另一个文件,则必须这样声明
void next(void); 
//初始化外部变量:如果没有初始化,会被自动初始化为0 
int x=10;		
int y=3+10;
int x2=2*x;	 
int main(void)
{
	extern int Errupt;  //为了指出该函数使用了外部变量 ,可选的声明
	extern double Up[];		//可选的声明,不用指明数组大小, 	
}
/*
#include<stdio.h>
extern int units;	//外部变量 

int a=0;		//定义式声明,系统为变量a创建了存储空间 
extern int a;		//引用式声明,关键字extern 表明该声明不是定义,指示编译器去别处查询其定义 
void critic(void);

int main(void)
{
	
	 
	extern int units;	//可选的引用性声明
	
	printf("%d\n",units);
	printf("*****\n");
	scanf("%d",&units);
	while(units!=56)
		critic();
	printf("*****\n");
	return 0;
}
void critic(void)
{
	printf("很不幸,在试试!\n");
	scanf("%d",&units);	
} 
*/


/*	外部静态变量 */
static int svil=1;	//静态变量,内部链接
int traveler=1;		//外部链接
static int stayhome=1;		//内部链接 
int main()
{
	extern int traveler;	//引用式声明,指示编译器去别处查询其定义
	extern int stayhome;	//使用定义在别处的stayhome,	
} 


 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
存储类别主要包括自动存储类别(auto)、静态存储类别(static)、动态分配存储类别(dynamic allocation)和寄存器存储类别(register)。 1.自动存储类别(auto): 自动存储类别通常只在函数内部使用,其变量被存储在栈中。该变量在程序开始执行时,分配内存,在函数执行完后,这个分配在栈中的内存就会被释放。 2.静态存储类别(static): 静态存储类别中的变量在程序开始执行时便已经分配内存,在整个程序执行期间,这个内存块一直存在,直到整个程序退出。定义静态变量的场合与auto变量一样也是在函数内部定义的,但是它是在函数执行之前便已经分配内存。静态变量只能在定义它的函数内访问,但是它的值在下一次函数调用时仍然保持不变。 3.动态分配存储类别(dynamic allocation): 动态分配的内存是位于堆(heap)中的,和栈区和静态存储区是不同的,这个内存块的大小可以在运行时通过调用诸如malloc()函数动态分配内存,当不再需要它的时候使用free()函数进行释放。 4.寄存器存储类别(register): 寄存器存储类别中的变量通常指针或者计数器等很小的变量,就是告诉编译器要尽量将其存放在CPU的寄存器中,而不是内存中,这样可以加快程序运行速度。 总的来说,内存存储的分类主要是根据程序对存储空间的需求和使用次数等要素进行分配。程序员需要在写程序时根据实际需求选择不同的存储类别

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值