局部,全局(外部),static等变量详解

2023-05-16

 

 

首先,必须明白一个程序是包含若干个源文件,每个源文件又是包含若干个函数,每个源文件、函数中又定义了若干个变量。但是每个变量都有自己的作用范围,也就是自己的作用域。只有在作用域内才可以访问变量。

变量的有效范围称为变量的作用域( scope)。归纳起来,变量有4种不同的作用域:文件作用域( file scope)、函数作用域( function scope)、块作用域(block scope)和函数原型作用域( function prototype scope)。文件作用域是全局的,其他三者是局部的。

除了变量之外,任何以标识符代表的实体(如函数、数组.结构体.类等)都有作用域概念,与变量的作用域类似。

 

 

局部变量和全局变量

 

1.局部变量

在一个函数内部定义的变量称之为内部变量(局部变量),只在函数内有效。需要注意的是,函数原型声明中出现的参数名,只在原型声明括号中有效,他并不是实际存在的变量,不能被引用,编译系统对此变量名忽略,即使在调用函数时也不为其分配存储空间。

 

2.全局变量

在函数外定义的变量是外部变量,称为全局变量,有效范围是从定义点到本源文件结束。需要注意的是尽管全局变量可以增加函数之间的数据交流,但仍然不建议过多使用全局变量,原因如下:

(1)全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。即分配在静态存储区。

(2)它使函数的通用性降低了,因为在执行函数时要受到外部变量的影响。如果将一个函数移到另一个文件中,还要将有关的外部变量及其值一起移过去。但若该外部变量与其他文件的变量同名,就会出现问题,降低了程序的可靠性和通用性。,

(3)在程序设计中,一般要求把程序中的函数做成一个封闭体,除了可以通过“实参形参”的渠道与外界发生联系外,没有其他渠道。这样的程序移植性好,可读性强。使用全局变量过多,会降低程序的清晰性,人们往往难以清楚地判断出每个瞬时各个全局变量的值。在各个函数执行时都可能改变全局变量的值,程序容易出错。因此,要限制使用全局变量。

 (4)如果在同一个源文件中,全局变量与局部变量同名,则在局部变量的作用范围内,全局变量被屏蔽,即它不起作用,此时可以使用局部变量。

 

变量的存储方式

 

动态存储方式与静态存储方式

上面讲到的变量的一种属性作用域,作用域是从空间的角度来分析的,分为全局变量和局部变量。变量还有另一一种属性一存储期( storage duration,也称生命期)。存储期是指变量在内存中的存在周期。这是从变量值存在的时间角度来分析的。存储期可以分为静态存储期( static storage duration) 和动态存储期( dynamicstorage duration)。这是由变量的静态存储方式和动态存储方式决定的。

所谓静态存储方式是指在程序运行期间,系统对变量分配固定的存储空间。而动态存储方式则是在程序运行期间,系统对变量动态地分配存储空间。

 

变量的存储位置

先看一下内存中的供用户使用的存储空间的情况,可以将其分为三部分:

(1)程序区   (2)静态存储区   (3)动态存储区

程序中所用的数据存放在静态存储区与动态存储区中。

全局变量全部存放在静态存储区中,在程序开始执行时就给全局变量分配存储单元,程序执行完毕释放这些空间。程序执行过程中占据固定的空间。

动态存储区中存放:(1)函数形参(2)函数内定义的变量(未加static) (3)函数调用时的现场保护和返回地址等。当函数调用的时候才申请空间,函数执行完立即释放。

 

变量的存储类别

 

1.自动存储

函数中的局部变量,不用static声明时,编译系统对其动态分配存储空间。

注意:在复合语句中定义的变量,只在定义时分配空间,复合语句结束时自动释放空间。用关键字auto声明存储类别,使用举例:auto  int  a; 但是auto可以省略。即默认为自动变量。

2.static声明静态局部变量

(1)静态局部变量在静态存储区内分配存储单元。在程序整个运行期间不释放。

(2)对静态局部变量是在编译时赋初值的,所以只赋一次,在程序运行时就存在初值。以后的对其每次调用使用的是上一次函数结束的值。如果未赋初值,默认为0或空字符。而动态分配的结果不确定。

(3)静态局部变量对其他函数来讲是不可见的。

3.用register声明的寄存器变量

一般情况下,变量的值存放在内存当中。当程序使用到那一个变量的值的时候,由控制器发出指令将内存中该变量的值送到CPU中的运算器,如果结果需要保存,则再送回到内存中。

如果有一些变量使用频繁,比如i在for中循环使用10000次,则存取变量需要花费很多时间。C++允许将局部变量的值放在CPU的寄存器当中,需要时直接从寄存器中取出,因此可以提高执行效率。

但如今的编译系统可以自动识别使用频繁的变量,并将其放入到寄存器当中,所以只需要了解即可。

4. 用extern声明外部变量

(1)在一个文件内声明全局变量

如果外部变量不在开头定义,其有效作用范围只限定于定义位置到文件终了位置。如果定义点之前的函数想要引用该全局变量,则应该在引用之前用关键字extern对该变量作外部变量声明。

eg:

#include<iostream>

using namespace std;

int max(int,int);

int main()

{

         externint a,b;

         cout<<max(a,b)<<endl;

return 0;

}

int a=15;b=17;   //定义全局变量a,b

int max(int x,int y)

{

         intz;

         z=x>y?x:y;

         returnz;

}

(2).在多文件的程序中声明全局变量(外部变量)

如果一个程序包含两个文件,在两个文件中都要用到同一个全局变量num,不能在两个文件中都定义,否则在进行程序的连接时会出现“重复定义”的错误。正确做法是:在任一个文件定义外部变量num,而在另一个文件中对num做外部变量声明。

5.用static声明静态外部变量

当希望外部变量只限于被本文件使用时,而不能被其他文件引用。这是可以在定义外部变量时加一个static声明。

 

摘抄于  谭浩强  c++程序设计(第三版)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

局部,全局(外部),static等变量详解 的相关文章

  • 02 vue框架内部的各种指令和axios操作的代码详解

    目录 前言 第一个完整的Vue程序 el xff1a 挂载点 和 data xff1a 数据对象 v text指令 v html指令 v on指令 v show指令 v if指令 v bind指令 v for指令 v on指令补充 v mo
  • kill 与killall

    查询命令所属软件包 rpm qf usr bin killall psmisc 22 20 15 el7 x86 64 rpm qf usr bin kill util linux 2 23 2 65 el7 9 1 x86 64 命令参数
  • 第1章-1 从键盘输入两个数,求它们的和并输出 (30分)

    本题目要求读入2个整数A和B xff0c 然后输出它们的和 输入格式 在一行中给出一个被加数 在另一行中给出一个加数 输出格式 在一行中输出和值 输入样例 在这里给出一组输入 例如 xff1a 18 48 输出样例 在这里给出相应的输出 例
  • 第1章-2 从键盘输入三个数到a,b,c中,按公式值输出 (30分)

    在同一行依次输入三个值a b c xff0c 用空格分开 xff0c 输出 b b 4 a c的值 输入格式 在一行中输入三个数 输出格式 在一行中输出公式值 输入样例 在这里给出一组输入 例如 xff1a 3 4 5 输出样例 在这里给出
  • 第1章-3 输出“Python语言简单易学” (10分)

    输入格式 无 输出格式 输出一句短语 xff0c Python语言简单易学 如果包含汉字 xff0c 用 34 print s encode 34 utf 8 34 34 输出 如 xff1a s 61 34 人生苦短 xff0c 我学Py
  • 第2章-1 计算 11+12+13+...+m (30分)

    输入一个正整数m 20 lt 61 m lt 61 100 xff0c 计算 11 43 12 43 13 43 43 m 的值 输入格式 在一行输入一个正整数m 输出格式 在一行中按照格式 sum 61 S 输出对应的和S 输入样例 在这
  • 第2章-2 计算分段函数[1] (10分)

    本题目要求计算下列分段函数f x 的值 xff1a 输入格式 输入在一行中给出实数x 输出格式 在一行中按 f x 61 result 的格式输出 xff0c 其中x与result都保留一位小数 输入样例1 10 输出样例1 f 10 0
  • 第2章-3 阶梯电价 (15分)

    为了提倡居民节约用电 xff0c 某省电力公司执行 阶梯电价 xff0c 安装一户一表的居民用户电价分为两个 阶梯 xff1a 月用电量50千瓦时 xff08 含50千瓦时 xff09 以内的 xff0c 电价为0 53元 千瓦时 xff1
  • 第2章-4 特殊a串数列求和 (20分)

    给定两个均不超过9的正整数a和n xff0c 要求编写程序求a 43 aa 43 aaa 43 43 43 aa a xff08 n个a xff09 之和 输入格式 xff1a 输入在一行中给出不超过9的正整数a和n 输出格式 xff1a
  • 第2章-5 求奇数分之一序列前N项和 (15分)

    本题要求编写程序 xff0c 计算序列 1 43 1 3 43 1 5 43 的前N项之和 输入格式 输入在一行中给出一个正整数N 输出格式 在一行中按照 sum 61 S 的格式输出部分和的值S xff0c 精确到小数点后6位 题目保证计
  • 第2章-6 求交错序列前N项和 (15分)

    本题要求编写程序 xff0c 计算交错序列 1 2 3 43 3 5 4 7 43 5 9 6 11 43 的前N项之和 输入格式 输入在一行中给出一个正整数N 输出格式 在一行中输出部分和的值 xff0c 结果保留三位小数 输入样例 5
  • 第2章-7 产生每位数字相同的n位数 (30分)

    读入2个正整数A和B xff0c 1 lt 61 A lt 61 9 1 lt 61 B lt 61 10 产生数字AA A 一共B个A 输入格式 在一行中输入A和B 输出格式 在一行中输出整数AA A 一共B个A 输入样例1 在这里给出一
  • lsusb

    用法 xff1a lsusb hUsage lsusb options List USB devices v verbose Increase verbosity show descriptors s bus devnum Show onl
  • 第2章-8 转换函数使用 (30分)

    输入一个整数和进制 xff0c 转换成十进制输出 输入格式 在一行输入整数和进制 输出格式 在一行十进制输出结果 输入样例 在这里给出一组输入 例如 xff1a 45 8 输出样例 在这里给出相应的输出 例如 xff1a 37 a b 61
  • 第2章-9 比较大小 (10分)

    本题要求将输入的任意3个整数从小到大输出 输入格式 输入在一行中给出3个整数 xff0c 其间以空格分隔 输出格式 在一行中将3个整数从小到大输出 xff0c 其间以 gt 相连 输入样例 4 2 8 输出样例 2 gt 4 gt 8 nu
  • 第2章-10 输出华氏-摄氏温度转换表 (15分)

    输入2个正整数lower和upper xff08 lower upper 100 xff09 xff0c 请输出一张取值范围为 lower xff0c upper 且每次增加2华氏度的华氏 摄氏温度转换表 温度转换的计算公式 xff1a C
  • 第2章-11 求平方与倒数序列的部分和 (15分)

    本题要求对两个正整数m和n xff08 m n xff09 编写程序 xff0c 计算序列和m 2 43 1 m 43 m 43 1 2 43 1 m 43 1 43 43 n 2 43 1 n 输入格式 输入在一行中给出两个正整数m和n
  • 第2章-12 输出三角形面积和周长 (15分)

    本题要求编写程序 xff0c 根据输入的三角形的三条边a b c xff0c 计算并输出面积和周长 注意 xff1a 在一个三角形中 xff0c 任意两边之和大于第三边 三角形面积计算公式 xff1a area 61 s s a s b s
  • 第2章-13 分段计算居民水费 (10分)

    为鼓励居民节约用水 xff0c 自来水公司采取按用水量阶梯式计价的办法 xff0c 居民应交水费y xff08 元 xff09 与月用水量x xff08 吨 xff09 相关 xff1a 当x不超过15吨时 xff0c y 61 4x 3
  • 第2章-14 求整数段和 (15分)

    给定两个整数A和B xff0c 输出从A到B的所有整数以及这些数的和 输入格式 xff1a 输入在一行中给出2个整数A和B xff0c 其中 100 A B 100 xff0c 其间以空格分隔 输出格式 xff1a 首先顺序输出从A到B的所

随机推荐

  • 第3章-1 3-1.大于身高的平均值 (10分)

    中小学生每个学期都要体检 xff0c 要量身高 xff0c 因为身高可以反映孩子的生长状况 现在 xff0c 一个班的身高已经量好了 xff0c 请输出其中超过平均身高的那些身高 程序的输入为一行数据 xff0c 其中以空格分隔 xff0c
  • Cudnn与Pytorch的安装

    win键搜索cmd xff0c 右键选择管理员 xff0c 运行命令 xff1a conda install pytorch torchvision cuda100 c pytorch 注意 xff1a 这是CUDA10 0版本的pytor
  • Pycharm的字体大小设置 与 如何取消自动更新

    Pycharm的字体大小有两种设置比较舒服 第一种是ctrl 43 滑轮的上下滚动调节 xff0c 但是调节过后的效果具有时效性 xff0c 也就是当你再次打开Pycharm后 xff0c 字体大小又变回了基础设置的大小 第二种直接调整基础
  • “-1” 文件删除

    无法删除以短连接符开头 1 的文件 rm rf 1 或 rm rf 34 1 34 问题原因 xff1a 短连接符会被当作选项解析 解决方式有两种 xff1a 一种加前缀使用相对或绝对路径 xff1b 一种使用 标识选项解析结束 xff08
  • 01 梯度下降、学习率、损失函数

    概念引入 基于一个自变量x xff0c 比如时间 xff0c 我们可以得到其对应的观测值y xff0c 比如温度值 不停的观测 xff0c 我们可以得到一系列的真实对应关系 xff1a 时间 xff0c 温度的真实值 xff0c 即 x1
  • 02 LinerRegression

    问题引入 xff1a 这就是个简单的线性回归函数的计算问题 现在我们已知一次函数 y 61 4x 43 9 xff0c bias为一个服从标准正态分布的随机随机数值 那么通过 y 61 4x 43 9 43 bias xff0c 当我们给定
  • Mysql 5.1.70 及 Navicat 安装教程

    为了避免安装后期出现Bug xff0c 首先必须明确电脑中从未安装过Mysql xff0c 或者安装过Mysql并且卸载干净 xff0c 否则二次安装会出错 此外 xff0c 安装过Mysql xff0c 并且进行过卸载 xff0c 需要进
  • jdk的配置与eclipse的使用

    首先自然是安装包从哪里获得这个问题 xff1a jdk历史版本 xff1a https www oracle com java technologies oracle java archive downloads html eclipse历
  • 01 原生JDBC的使用缺陷与基础环境配置

    开发环境 jdk1 7 0 72 eclipse eclipse 3 7 indigo mysql mysql5 1 相关安装教程 jdk的配置与eclipse的使用 与 Mysql 5 1 70 及 Navicat 安装教程 工程目录 创
  • 02 Mybatis结构配置

    文章目录 01 mybatis介绍 02 mybatis框架工作流程 03 ecplice项目jar包导入方法 04 在项目中导入mybitis框架的依赖包 05 项目下创建config文件夹 06 xml配置文件的设置 07 pojo数据
  • 03 Mybatis入门程序

    1 配置SqlMapConfig 配置数据库连接相关信息 span class token prolog lt xml version 1 0 encoding UTF 8 gt span span class token doctype
  • 04 Mybatis的增删改查

    1 mybatis中sql语句的占位符与parameterType 与 parameterType 表示一个占位符 向占位符输入参数 mybatis自动进行java类型和jdbc类型的转换 程序员不需要考虑参数的类型 比如传入字符串 myb
  • C++链表的各种操作

    题目描述 代码 include lt iostream gt include lt algorithm gt using namespace std struct sqList int data sqList next sqList Lis
  • HJ001 字符串最后一个单词的长度

    目录 题目描述 输入描述 输出描述 输入 输出 做题思路 AC代码 题目描述 计算字符串最后一个单词的长度 xff0c 单词以空格隔开 输入描述 输入一行 xff0c 代表要计算的字符串 xff0c 非空 xff0c 长度小于5000 输出
  • 盲签名 blind signature 简介

    转 https blog csdn net zhang hui cs article details 8728776 盲签名 Blind Signature 定义 是一种数字签名的方式 在消息内容被签名之前 对于签名者来说消息内容是不可见的
  • VMware 虚拟机安装 OpenWrt 作旁路由 单臂路由 img 镜像转 vmdk 旁路由无法上网 没网络

    重要注意事项 由于布线原因笔记本只能采用无线的方式连接路由器 xff0c 在Windows10的环境下使用无线网卡桥接 xff0c 结果软路由无法上网 xff0c 翻阅了各种帖子最终发现跟系统底层的协议栈有关系 xff0c 随即放弃使用有线
  • HJ002 计算某字母出现的次数

    目录 题目描述 输入描述 输出描述 输入 输出 做题思路 1 AC代码 1 做题思路 2 AC代码 2 题目描述 写出一个程序 xff0c 接受一个由字母 数字和空格组成的字符串 xff0c 和一个字母 xff0c 然后输出输入字符串中该字
  • HJ003 明明的随机数

    目录 题目描述 输入描述 输出描述 输入 输出 说明 做题思路 AC代码 题目描述 明明想在学校中请一些同学一起做一项问卷调查 xff0c 为了实验的客观性 xff0c 他先用计算机生成了N个1到1000之间的随机整数 xff08 N 10
  • new,delete使用详解(动态多维数组空间申请)

    C语言中利用库函数malloc和free来分配和撤销空间的 C 43 43 中的new与delete是运算符 xff0c 不是函数 xff0c 所以执行效率更高 但C 43 43 中也是可以使用malloc和free的 但是一来不方便 xf
  • 局部,全局(外部),static等变量详解

    首先 xff0c 必须明白一个程序是包含若干个源文件 xff0c 每个源文件又是包含若干个函数 xff0c 每个源文件 函数中又定义了若干个变量 但是每个变量都有自己的作用范围 xff0c 也就是自己的作用域 只有在作用域内才可以访问变量