C语言 储存类别

@Chita_

C语言 储存类别

  1. 变量的生命期和作用域

变量的生命期和作用域

变量具有生命期:从变量分配内存开始,到内存“取消分配”时结束
变量具有作用域:这些是程序中可见变量的部分

生命周期也称为存储持续时间

生命期

  • 静态
    一个静态变量是存在于整个程序执行期间;程序启动时即分配内存

  • 自动
    一个自动变量存在于包含它的块中。 执行进入块时分配的内存,执行离开块时取消分配的内存

  • 动态
    从分配内存到取消分配内存在动态变量。 分配和取消分配是通过动态内存分配函数调用显式完成的

作用域

  • 局部变量
    局部变量仅在当前最里面的块内部可见
  • 全局变量
    全局变量从声明行到文件末尾,在整个编译单元中都可以看到一个全局变量
  • 外部变量
    外部变量在所有编译单元中均可见

存储类一览

C语言储存类声明默认初始值初始化频率存储在作用域生命期
自动块内Garbage每次进入块内存局部自动
静态块内0程序第一次启动时内存局部静态
块外0程序第一次启动时内存全局静态
外部在所有块外0程序第一次启动时,内存外部静态
寄存器块内Garbage每次进入块Maybe in register局部自动

自动储存类的声明

{
	auto double x; /*Same as: double x;*/
	int num; /*Same as: auto int num;*/
}

auto是定义在函数体或语句块内的变量的默认存储类
自动前缀是可选的;也就是说,任何局部声明的变量都是自动的,除非被定义为静态的

静态储存类的声明

{
	static double local_static;
}
void func1(int a)
{	
	...
}

static int global_static;

void func2(int b)
{
	...
}

必须包含静态前缀

例:

#include <stdio.h>
void strange( int x )
{
	static int y;
	if ( x == 0 )
		printf( "%d\n", y );
	else if ( x == 1 )
		y = 100;
	else if ( x == 2 )
		y++;
}
int main (void)
{
	strange(1); /* Set y in strange to 100 */
	strange(0); /* Will display 100 */
	strange(2); /* Increment y in strange */
	strange(0); /* Will display 101 */
	return 0;
}

输出

100
101

外部储存类的声明

外部储存类 是在任何函数主体外部定义的变量的默认存储类

void func1(int a)
{}

int global;

void func2(int b)
{}

例1:

#include <stdio.h>
float x = 1.5;
void show (void)
{
	printf("%f\n", x); /* Access external x */
}
int main (void)
{
	printf("%f\n", x); /* Access external */
	show();
	return 0;
}

例2a:

#include <stdio.h>
extern float x;
void show (void)
{
	printf("%f\n", x); /* Access external x */
}
int main (void)
{
	printf("%f\n", x); /* Access external x */
	show();
	return 0;
}
float x = 1.5; 

例2b:

#include <stdio.h>
void show (void);
int main (void)
{
	printf("%f\n", x); /* Access external x */
	show();
	return 0;
}
float x = 1.5; 
#include <stdio.h>
extern float x;
void show (void)
{
	printf("%f\n", x); /* Access external x */
}

寄存器储存类

最快的存储位于中央处理器本身的高速内存单元中,称为寄存器
程序员可以请求编译器使用CPU寄存器来存储

register int k;

编译器可以忽略请求,在这种情况下,存储类默认为auto
寄存器变量是包含它的块的局部变量

Variable Shadowing(变量阴影)

•声明内部范围内的变量并为其赋予与外部范围内声明的另一个变量相同的名称时,将发生变量阴影

int x = 100;
int main (void)
{
	int x = 1;
	printf("%d\n", x);
	return 0;
}

外部作用域中的变量被内部作用域中的变量遮盖

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值