第60节 变量的存储类别

一.程序运行中的内存分配

1.程序运行时内存分区: 程序区/静态数据区/动态数据区

1.1 程序区: 存放运行中的代码;

1.2 静态数据区: 存放全局变量/静态变量;

1.3 动态数据区: 存放局部变量.

2.四种存储类别

2.1.自动的(auto) [ˈɔːtəʊ]

2.2 寄存器的(register) [ˈredʒɪstə]

2.3 外部的(extern) [ˈekstɜːn]

2.4 静态的(static) [ˈstætɪk]

二.自动变量(auto variable) [ˈveəriəbl]

1.auto是局部变量默认的存储类别,通常省略不写,例

① auto int b,c = 3 ;

② int b, c =3 ; //两种写法效果相同

2.自动变量在定义时自动分配存储空间,在作用域结束时自动释放空间.

3.自动局部变量存储在动态存储区,用于全局变量时,编译器会提示错误.

三.用register声明寄存器变量 [ˈredʒɪstə]

1.程序数据读取过程: 外存(磁盘等)–>内存–>CPU(包含控制器/运算器/寄存器)

2.用register声明寄存器变量举例

int fac(int n) //自定义阶乘函数
{
	//下面声明i和f是寄存器变量
	register int i,f=1;
	for(i=1;i<=n;i++) f=f*i;
	return f;
}

3.寄存器在CPU中,离运算器最近,访问最直接,速度最快的存储部件.

4.在程序中定义寄存器变量对编译系统只是建议性(而不是强制性)的.

5.优化的编译系统能够识别使用频繁的变量,自动地将这些变量放在寄存器中.

**四.用extern声明引用外部变量 [ˈekstɜːn] **

#include <stdio.h>
int max(int, int);
int main()
{
	extern int a, b; //对全局变量a,b作提前引用,否则提示未定义;
	printf("%d\n", max(a, b));
	return 0;
}
int a = 15, b = 7; //此处全局变量定义作用域不在main()内
int max(int x, int y)
{
	int z;
	z = x > y ? x : y;
	return z;
}

注: 全局变量/外部变量存储在内存的静态数据区

五.用static声明静态局部变量 [ˈstætɪk]

1.用static声明静态局部变量

int f(int a)
{
	static int c=3;
	……
}

2.static静态局部变量性质

2.1 局部特性:作用范围仅限于本函数

2.2 静态特性:存储在静态区,函数调用结束后保留原值,下次调用时,采用上次的值。

#include <stdio.h>
int f(int a)
{
	auto 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++)
		printf("%d ", f(a));
	printf("\n");
	return 0;
}
运行结果: 
 7 8 9

3.静态局部变量的应用场合

例:需要保留函数上一次调用结束时的值时(如计数)

#include <stdio.h>
int count_calls()
{
	static int ctr=0;
	return ++ctr;
}
int main( )
{
	int i;
	for(i=0; i<10; i++)
	printf("%d\n", count_calls());
	return 0;
}

4.静态局部变量的缺点:

4.1 静态局部变量长期占用静态存储区,影响效率;

4.2 降低程序的可读性,当调用次数多时不确定当前值是什么.

注: 除非必要,尽量少用.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值