20201026-成信大-C语言程序设计-20201学期《C语言程序设计B》C-关于【生存期】【作用域】【可见性】

本文详细解析了C语言中变量的概念,包括生存期、作用域和可见性等,并介绍了不同类型的变量及其特性,如自动变量、静态局部变量和寄存器变量等。

20201026-成信大-C语言程序设计-20201学期《C语言程序设计B》C-关于【生存期】【作用域】【可见性】

概念理解

生存期:一个变量值在某一时刻是存在的【在内存中某个位置,或是某个内存区里】,则这个时期就是这个变量的生存期;
作用域:一个变量在某个文件、函数、语句块的范围内是有效的,则这个范围就是这个变量的作用域;
可见性:在一个变量的作用域可以引用该变量,则说这个变量在这个作用域是可见的,这么一个性质就是可见性,就是:如果可以实现对该变量的存取操作,即为可见;

另外几个重要概念

数据类型:浮点型,整型,字符型等都是一个数据类型;

  • 类型本身
  • 相关操作
  • 存取方式

数据存储类型:数据在内存中的存储方式;

  • 自动
  • 静态
  • 寄存器
  • 外部
    又叫存储类别
    注意:数据类型和数据存储类型都是针对于声明或定义的函数和变量而言的;

动态存储类型:变量或函数,在被使用时临时分配内存单元,在函数结束后所占用的内存单元将会被释放,例如局部变量;因此,动态存储的变量每次被调用时所占的内存单元的地址可能会发生改变;

  • auto 类型

静态存储类型:变量或函数,在程序运行期间编译器统一分配内存单元,直到程序结束分配的内存才被释放;例如:全局变量;

  • static类型

内存中供用户使用的存储空间

程序区,即代码区:

  • CPU指令

静态存储区

  • 全部的全局变量
  • 局部静态变量

动态存储区

  • 被调用函数的形参;
  • 被调用函数中非局部静态变量;
  • 函数调用时的现场保护和返回地址等

注:

  1. 在平时编程过程中,一般对变量和函数的声明和定义都应同时指定数据类型和数据存储类型;如果我们没有对变量进行指定数据存储类型,则默认为auto类型
  • 对auto型,分配内存后,该内存空间里的值是未知的
  • 如果未进行初始化,不要使用该值,因为不可预知后果
  • 所以一定要在初始化之后,再使用对应的量
  • 一旦用完,不再使用时,就释放掉了
  • 再次使用,会再重新分配内存
  1. 在定义全局变量局部静态变量时,如果没有赋初始值,系统会默认为0;而动态变量们竟会被随机赋值
  • 内存不被释放,再次使用,仍然使用之前【之前的那个内存空间】存进去的值
  • 局部静态和全局变量一样,会长期占用内存,但作用域上有差别
  • 局部静态只完成一次赋初值,也只能在此时赋初值,编译器要求初值为常量【??不确定,需要再查阅一下】
  • 如果不给初值,则默认初值为0
  • 就好象初恋只有一次一样,但可以多次恋爱

局部变量的存储类型

  1. 自动变量—auto
    定义:函数中,包括复合语句内和形式参数在内的变量中,不被static限制的变量;
    性质:动态存储类型,系统调用函数时临时分配内存单元;函数执行结束就占用的内存释放;
    注:大多数情况下,自动变量是可以直接省略auto的,系统也会默认为自动变量;

2.静态局部变量—static
定义:函数内被静态static限制的局部变量;静态局部变量在函数执行结束时,内存不被释放,函数下次被执行的时候,此变量的值并不改变;
性质:静态存储类型,函数每次被调用其值还是上次函数执行时的值,且默认的初始化的值是0;

3.寄存器变量—register变量
定义:存放在CPU寄存器中的变量;(寄存器存储类型也是随着函数的结束,内存被释放)
形式:register int a = 1; \将定义的a送到寄存器中;

4.全局变量的存储类型
外部变量extern:定义在函数外的变量,也可以说就是全局变量;
全局变量的有效域:自定义处起以下范围;

相对概念

  • 作用域大小,全局,局部
  • 内部,外部,外部的内部,内部的内部

从变量的作用域角度可以对变量进行分类为【全局变量】和【局部变量】
从变量值的生存期可以对变量进行分类为【静态存储方式】和【动态存储方式】
用户的存储空间可大致分为以下三种
1、程序区
2、静态区
3、动态区

对应的理解

从生存时间的角度来看:
自动变量:随着函数的进栈和出栈而创建和销毁
静态变量:长期存在静态存储区,直到程序结束 【编译时就给定了】
外部变量:长期存在静态存储区,直到程序结束 【编译时就给定了】
寄存器变量:离开函数值就会消失

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值