一.程序运行中的内存分配
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 降低程序的可读性,当调用次数多时不确定当前值是什么.
注: 除非必要,尽量少用.