第8章 变量的存储类型

自动变量(局部变量)

函数内部定义的变量被称为自动变量,用关键字auto表示

一般使用的都是自动变量,auto int x; 相当于 int x;

作用域局限于函数之内,当函数被调用时,在栈区为其分配内存空间,生命期在函数调用期间

形参也是自动变量

所有函数共享栈,所以函数结束后,自动变量无法保持其值

在C语言中,自动变量没有默认初值

 

外部变量(全局变量)

在函数外部定义的变量称为外部变量,关键字extern表示

生命期和作用域为全局,被存放在内存的全局数据区,生命期为程序的整个执行期间

默认初值为0

一个外部变量通常要经过 定义变量 和 说明变量 后才能使用

  使用外部变量时,应当在函数内作引用说明,即extern int a;  a=100;

  如果在同一个源程序文件内,则可以省略引用说明,直接 a=100;

  意味着,不同文件可以互相调用外部变量,但是必须作引用说明

  命名重复时,自动变量会屏蔽外部变量

 

静态变量

static int number;

编译程序会为静态变量分配一个固定的数据区存储空间,其存储特点(生命期、初始化等)与外部变量相同;

  值在整个程序的运行期间都被保留

  初始化为0

静态变量又分为内部静态变量和外部静态变量

  内部静态变量作用域与自动变量相同,区别在于前者可以保留上一次的值供下一次调用使用;全局生命期,局部作用域;

  

 

  外部静态变量与外部变量差别在于,前者只对本源程序文件有效,对其他文件无需,后者对所有文件都有效;

可以将函数定义为静态函数,使得其作用域仅限于本源程序文件内

 

 

 

寄存器变量

register int x;

目的:提高经常使用的变量的存取速度

实质:编译程序将变量存放在CPU寄存器中,而不放在内存中

限制:由于寄存器长度的限制,寄存器变量只能用于整型(位长度不能超过寄存器位长度)和字符型;

寄存器变量的数目收到机器类型的限制,多的寄存器变量将被自动转换成自动变量;因此寄存器变量的定义是一个请求,而不是命令;

寄存器变量无初值,可以作形参

  void func(static int a);  报错

  void func(register int a);  通过

外部和静态只一次初始化;局部和寄存器每调用一次函数都初始化一次;

 

动态内存分配函数

两种内存分配方式

静态分配:上述四种,预先分配一次内存,运行过程中不能变动,预先确定大小;

动态分配:堆中进行;优点:1、程序运行的不同阶段,同一内存能为程序的不同部分服务;2、允许建立链表;

常用动态分配函数

1、malloc(size):分配大小为size字节的内存空间

原型:void malloc(unsigned size);

返回值是无类型的指针,所以需要强制转换;

2、calloc(n, size):分配n个具有size字节的内存空间

3、realloc(ptr, size):改变已分配的存储空间

4、free(ptr):释放由指针访问的存储空间

原型:void free(void *ptr);

放在stdlib.h中

:程序检查内存中自由存储空间的大小

 

posted @ 2021-03-07 22:53  头秃1997  阅读(141)  评论(0)    收藏  举报