首页 > 其他分享 >函数变量和生存期

函数变量和生存期

时间:2024-12-03 13:28:24浏览次数:13  
标签:储存 变量 静态 局部变量 生存期 全局变量 函数

每一个变量都有一个作用域问题,即它们在什么范围内有效。

文章目录


前言

定义变量有三种形式:

(1)在函数的开头定义;(局部变量)

(2)在函数内的复合语句定义;(局部变量)

(3)在函数的外部定义;(全局变量)


一、局部变量是什么?

局部变量在函数内部定义,且在本函数内部范围内有效

  1. 主函数内定义的变量只在主函数内有效
  2. 不同函数内可使用同名变量 
  3. 形式参数也是局部变量
  4. 一个函数中可以在复合语句内定义变量,但只在复合语句中有效,这种语句称为”程序块

二、全局变量

函数之外定义的变量,也叫全局变量,也叫外部变量,也叫全程变量

  1.  全局变量在整个程序范围内有效,可以为本文件内所有其它函数共用
  2. 有效范围从定义变量开始到本源文件结束
  3. 由于同一个文件中的所有函数都能引用全局变量的值,因此,在函数中改变了全局变量,就会影响到其它函数中全局变量的值,相当于各个函数之间有直接传递通道。
  4. 可以利用全局变量来增加函数之间的联系渠道,通过函数调用得到一个以上的值。

三、变量储存方式和生存周期 

变量的值存在的时间,我们把它叫做生存期

有的变量在程序运行的整个过程中都是存在的,有的是在需要用的时候才临时分配存储单元,而在函数调用结束后该程序就立马释放。

变量的储存方式分为动态储存方式静态储存方式


1. 动态储存方式和静态储存方式

储存空间有三部分:

  1. 程序区;
  2. 静态储存;
  3. 动态储存; 

test.c——(编译)——————————(链接)——————test.exe可执行程序——执行-> 

                全局变量(静态存储区)                                                          局部变量(动态存储区)

静态储存方式:由系统自动分配好的存储单元(编译)

动态储存方式:在程序运行期根据需要进行动态的分配存储空间的方式

动态存储区又叫做栈区


2.储存类别

C语言储存类别有4种:自动(auto),静态储存(static),寄存器的(register),外部的(extern)

· 自动变量

 在函数调用时,系统会给函数分配储存空间,在函数调用结束时,自动释放这些储存空间。

· 静态局部变量

函数调用结束后,不消失而继续保留原值,其被占用的储存单元不释放。在下一次被调用时,函数已经有值(就是上一次调用结束的值)

(1)静态局部变量属于静态存储区,在静态存储区内分配存储单元。

(2)对静态局部变量是在编译时赋初值的,即只赋值一次。以后每一次调用函数不在重新赋值,而是保留上一次函数调用结束时的值;而对自动变量赋初值,不是在编译时进行,而是在函数调用时进行的,每调用一次函数重新给一次初值,相当于执行一次赋值语句。

(3)如果在定义局部变量不赋初值,则对静态局部变量来说编译器自动赋初值为0(对数值型变量)或空字符’\0‘(对字符变量);对自动变量来说,它的值是一个不确定的值,由于每次函数调用结束后存储单元已释放,而下次调用需重新分配,所分配单元是不可知的。

(4)虽然静态局部变量被调用后值仍然存在,但是其它函数不能引用它,只能在作用域范围内被引用。

但是,用静态存储需要多占内存(长期占用内存不释放,而不能像动态存储那样,一个内存空间可先后被多个变量使用,节约内存),静态就降低了内存利用率,可读性不强,若非必要,不使用静态局部变量。


· 寄存器变量

把大量重复的变量放在寄存器中,寄存器在CPU中,能大大提高代码执行效率。

不过随着技术发达,计算机速度越来越高,优化系统能自动将这些变量放在寄存器中,不需要程序设计指定。

3.全局变量的储存类别

全局变量存储在静态区,它们的生存期是固定的,存在于程序的整个运行周期。

  • 在一个文件内扩展外部变量的作用域(extern)
  • 将外部变量的作用域扩展到其它文件(extern)
  • 将外部变量的作用域限制在本文件中(static)

(1)对局部变量static的声明,把他分配在静态存储区内,该变量在整个程序执行期间不释放,其分配的空间始终存在。

(2)对全局变量static的声明,该变量的作用域受到限制,只限于本文件模块使用


总结

局部变量与全局变量同名,优先使用局部变量

标签:储存,变量,静态,局部变量,生存期,全局变量,函数
From: https://blog.csdn.net/2401_88850882/article/details/144194585

相关文章

  • 什么是函数式编程?它有什么优缺点?
    函数式编程是一种编程范式,它将计算视为数学函数的求值,避免状态变化和数据可变。它强调:纯函数:给定相同的输入,总是返回相同的输出,并且没有副作用(例如修改全局变量或进行I/O操作)。不可变数据:数据一旦创建就不能更改。要更新数据,需要创建一个新的数据副本,而不是修改原始数据。......
  • 在PbootCMS中如何使用[list:isico]变量判断文章是否有缩略图?
    在PbootCMS中,[list:isico] 变量用于判断文章是否上传了缩略图。通过这个变量,你可以在模板中灵活地控制文章列表中的图片显示逻辑。以下是详细的使用方法和示例:理解[list:isico]变量:[list:isico] 是一个布尔变量,返回值为1表示文章已上传缩略图,返回值为0表示文章未上传缩略图......
  • 变量与函数
    变量与函数变量新的值会覆盖掉旧的值新值的数据类型不必与旧值相同变量命名规则:1.必须以字母与下划线开头2.明明可由字母、数字和下划线组成3。大小写敏感4.尽量避免使用保留字命名多变量赋值a=b=c=2a,b,c=1,2,3函数defxxxx():如果参数数目没有匹配,会报错语句表达式......
  • Task03数据类型和操作&Task04变量与函数
    Task03数据类型和操作&Task04变量与函数常用内置类型整数int浮点数float布尔值bool类型Type列表List元组Tuple集合Set字典Dictionary(dict,或映射map)复数complex函数Function模块Module常用内置常数True表示布尔真False表示布尔假None表示......
  • Task04 变量与函数
    Task04变量与函数变量新的值会覆盖掉旧的值新值不必与旧值相同变量指代的是一段数据Tips:变量命名规则:​ 1.必须以字母或下划线(_)开头​ 2.命名可由字母,数字和下划线组成​ 3.大小写敏感​ 4.尽量避免使用保留字命名(python中的保留字与自己命名的冲突后会很麻烦)函数......
  • js 原生js几种函数继承方式
    //1.原型链继承functionAnimal(name){this.name=name;this.colors=['black','white'];}Animal.prototype.getName=function(){returnthis.name;};functionDog(name){this.type='dog';}Dog.prototype......
  • 分区函数partition by的基本用法【转载】
    本章将和大家分享分区函数partitionby的基本用法(此处以MySQL为例)。废话不多说,下面我们直接进入主题。一、建表语句--创建商品表CREATETABLEcommodity(idintNOTNULLPRIMARYKEYCOMMENT'主键',positionVARCHAR(50)COMMENT'位置(商品放置的货架)',t......
  • 变量及数据类型(二)
    1、变量: 在程序执行过程中值可以被改变的量 变量代表内存中具有特定属性的一个储存单元,用来储存数据,也就是存放变量的值 变量有一个名字,以便于可以通过名字访问变量例如:#include<dtdio.h>intmain(){//①:声明变量并初始化intage=21;//这里的=是赋值......
  • Python 函数详解
    Python函数详解Python中的函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段。函数可以提高应用的模块性,和代码的重复利用率。本文将详细介绍Python中的函数定义、使用和特性。什么是函数在Python中,函数是通过def关键字定义的。函数可以接受参数,并可......
  • golang中方法和函数的区别
    目录函数方法示例对比函数示例方法示例总结值接收者使用场景特点指针接收者使用场景特点总结值接收者使用方法示例代码指针接收者使用方法示例代码总结在Go语言中,方法和函数是两个不同的概念,尽管它们看起来相似。主要的区别在于它们的定义方式以及与类型的关系。让我们用简单......