复习变量的存储类型之大综合

在静态和动态两大类存储类型中,c语言将变量的存储类型分为四种,
auto 自动变量
static 静态局部变量
extern 外部变量
register 寄存器变量

书写形式 存储类型符 数据类型符 变量名表

局部变量的存储定义

若存储类型省略或写为auto 均为自动变量
自动变量属于动态存储类 系统在运行时为其自动动态分配空间
离开他的作用域时系统收回他的存储空间 因此自动变量的生存期就是程序进入其作用域期间,自动变量在初始化之前或没有赋值之前 他的值无法确定

静态局部变量 static

有时候希望局部变量的值 在每次离开起作用范围后不消失 并且保持原值,占用的存储空间不释放 应使用存储定义符static 将变量定义为静态局部变量
静态局部变量属于静态存储类型 在静态存储区为其分配空间
(动态存储区和静态存储区 堆栈动态 常量之类的全局变量静态变量都是静态存储区 。。。生涩的语言 可以看看我下一篇的代码 (可能很水,但脸皮够厚) 动态内存管理的模拟实现 数据结构的) 在整个运行种都不释放 变量的生存周期为程序的运行期 虽然静态变量的存储空间在整个程序运行中都保持但是 他的作用域外都不能被引用 函数的静态局部变量值可以在函数的两次调用之间保持值不变
对于静态局部变量 如果程序不对她初始化 编译器会自动根据数据的类型给他赋初值 数值型变量自动赋值为0 字符型变量赋值为空字符

寄存器变量

如果变量在程序中使用非常频繁则为了存取该变量需要消耗很多时间 利用寄存器操作速度快的特点将变量存放在cpu的寄存器中 可以提高程序的运行效率 寄存器变量占用cpu的高速寄存器 不占用内存单位 变量的值就保存在cpu的寄存器中
寄存器变量仅能定义局部变量或是形参 不能用于全局变量
在ANSI标准中寄存器变量可以用于任何数据类型
寄存器变量定义符对编译器来说是一种请求 而不是命令 根据程序具体情况 编译器可自动地将某些寄存器变量改为非寄存器变量

全局变量的存储定义

1 外部全局变量

全局变量是在函数外部定义的变量 变量在编译时分配在静态数据区 生存期是程序运行期 作用域时从定义点往后的所有定义的函数均有效 当与函数内的局部变量同名时 全局变量无效 局部变量有效
如果一个源文件中将某些变量定义为全局变量 而这些全局变量允许其他源文件中的函数引用的话 需要在一个模块文件中将变量定义为全局变量而在引用这个变量的模块文件中 用存储类型符extern 将其说明为外部变量
在说明为外部变量时不在为其分配内存 extern定义符的作用只是将一个文件定义全局变量的作用域延伸到本源程序文件

静态全局变量

静态全局变量时一种全局变量 他被定义的源文件以外是不可见的 静态全局变量只限于他所在的源程序文件中的函数引用而不能被其他源程序文件中的函数引用 静态全局变量定义的形式实在全局变量定义语句的数据类型加静态存储定义符static 其定义形式和局部静态变量是一样的
静态全局变量分配在静态数据区 生存期是程序运行区 在这一点上 与静态局部变量是一样的 只是作用域方面不一样
虽然静态全局变量在其他文件不能用 但是在文件中的函数内都可以使用这两个变量 所以在其他文件调用这个文件中的函数有作用。非直接使用 。

一个数据包含两个方面的属性 数据类型和存储类型
从 作用域 区分局部变量 分为自动的 静态的 寄存器的 三种 全局变量分为 静态的和外部的
从生存期 角度 有动态存储和静态存储

内部函数和外部函数

对于一个多源程序文件 如果一个函数只能被本源函数所调用 这样的函数称为内部函数 也叫做静态函数
内部函数在定义时候 在函数类型前面加上 static
使用内部函数的好处是在一个较大程序的不同文件中函数同名不会产生相互干扰
外部函数可以被程序的其他文件调用
定义函数时省略extern 就隐含为外部函数
被另一个文件的函数调用也可以省略。

动态存储单元

C语言 在计算机中存储数据有两种方式 第一种方式时用过定义变量来存储 第二种方式 是通过C语言的动态存储分配系统来分匹配内存
在第一种方式下程序设计人员需要定义全局变量或这局部变量 第二种呜呜呜在程序运行中当需要这些存储空间时向系统申请 使用完毕将申请的内存空间退还给系统 内存空间的申请和退还通过c的存储分配系统的函数malloc(分配内存)realloc(重新分配)calloc(动态内存分配并清零) 和free实现的使用时应包含stdib.h
内存分配函数malloc格式
void *malloc(int size)
该函数功能是申请大小有参数size指定的内存空间 函数返回一个void 类型的指针 这个指针指向分配到的存储区的首地址 如果调用失败则返回一个空值 (系统定义的符号时null)void 类型指针 可用作各种数据类型的指针
函数的size 可以事先算好 也可以用运算符sizeof() 可以用if 语句判断是否动态分配内存是否成功
内存释放函数的free格式为
void free(void *ptr)free功能与malloc相反 参数prt时所要释放内存的首地址 即当初内存分配函数返回的指针

修饰符const

一种影响变量存取特性的修饰符 const 称为常量修饰符
用const修饰符说明的变量可以为其赋初值 但在程序运行期间 其值不能改变
const 数据类型 变量名
其中一个重要的用途就是用来保护函数的实参不被该函数修改

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值