文档章节

C++学习 【4.5】 利用函数实现指定的功能---局部变量、全局变量、变量的存储类别、声明和定义

黄美川
 黄美川
发布于 2016/01/27 11:59
字数 1429
阅读 31
收藏 0
点赞 1
评论 0

4.11局部变量和全局变量

每一个变量都有其有效作用范围,这就是变量的作用域


4.11.1局部变量

在一个函数内部定义的变量时内部变量,它只在本函数范围内有效。

同样在复合语句中定义的变量只在本复合语句范围内有效,这些内部变量称为局部变量(local variable)

说明:

  1. 主函数main中定义的变量(m,n)也只在主函数中有效,不会因为在主函数中定义而咋整个文件或程序中有效

  2. 形式参数也是局部变量。

  3. 在函数原型声明中出现的参数名,只在原型声明中的括号范围内有效,它并不是实际存在的变量,不能被引用,编译系统对函数声明中的变量时忽略的,即使在调用函数时也没有为它们分配存储单元。

4.11.2全局变量

在函数内定义的变量时局部变量,而在函数之外定义的变量时外部变量,称为全局变量(global variable),也称为全程变量。

全局变量的有效范围为从定义变量的位置开始到源文件结束

在一个函数中既可以使用本函数定义的局部变量,又可以使用有效的全局变量。

说明:

  1. 设全局变量的作用是增加了函数间数据联系的渠道

    如果在一个函数中改变了全局变量的值,就能影响到其他函数,使其他函数中引用的同名变量的值也同时改变,这相当于各个函数间有直接的传递通道。

    由于函数的调用只能带回一个返回值,因此有时可以利用全局变量增加函数间数据传递的渠道。

  2. 建议不在必要时不要使用全局变量,因为:

    a.全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。

    b.它是函数的通用性降低了,因为在执行函数时要收到外部变量的影响。如果将一个函数移到另一个文件中,还要将有关的外部变量及其值一起移过去。

       一般要求把程序中的函数做成一个封闭体,除了可以通过“实参---形参”的渠道与外界发生联系外,没有其他渠道。这样程序的一致性好,可读性强。

    c.使用全局变量过多,会降低程序的可读性。

  3. 在同一个源文件中,全局变量与局部变量同名,则在局部变量的作用范围内,全局变量被屏蔽,即它不起作用。


4.12 变量的存储类别

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

作用域侍从空间的角度来分析的,分为全局变量和局部变量。

变量还有另一种属性——存储期(storage duration,也称生命期)。存储期是指变量在内存中的存在周期。这是从变量值存在的时间角度来分析的。


存储期可以分为静态存储期(static storage duration)动态存储期(dynamic storage duration)

静态存储方式是指在程序运行期间,系统对变量分配固定的存储空间;

动态存储方式则是在程序运行期间,系统对变量动态分配存储空间。


在内存中的供用户使用的存储空间的情况,这个存储空间可以分为3种

用户区

程序区
静态存储区:全局变量
动态存储区:1.函数形式参数  2.函数中定义的变量   3.函数调用时的现场保护和返回地址


在C++中变量除了有数据类型的属性之外,还有存储类别(storage class)的属性。

存储类别指的是数据在内存中存储的方法。

存储方法分为静态存储和动态存储两大方法。

存储类别有4种:自动的(auto)、静态的(static)、寄存器的(register)、外部的(external)。

根据变量的存储类别,可以知道变量的作用域和存储期。

  1. 自动的:大部分都是

  2. 静态局部变量:

    静态局部变量是在编译时赋初值的...


4.13 变量属性小结

一个变量除了数据类型以外,还有3种属性:

  1. 存储类别

  2. 作用域

  3. 存储期

以上3种属性是有联系的,程序设计者只能声明变量的存储类别,通过存储类别可以确定变量的作用域和存储期。


要注意存储类别的用法:

  • auto,static,register这3种存储类别只能用于变量的定义语句。

  • extern只能用来声明已定义的外部变量,而不能用于变量的定义。


4.14 关于变量的声明和定义

函数的声明更是函数的原型,而函数的定义时函数功能的确立。

对变量而言:把建立存储空间的声明称作定义(如:int a),而把不需要建立存储空间的声明称为声明。

© 著作权归作者所有

共有 人打赏支持
黄美川
粉丝 2
博文 27
码字总数 19754
作品 0
杭州
程序员
C语言编程学习中,全局变量与局部变量同名时,如何判断

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界 ⋅ 05/10 ⋅ 0

C和C++语言static的作用(C++程序设计课本)以及对静态的理解

在C和C++中static的作用如下: (1)static修饰的局部变量(静态局部变量)存储期等于程序执行周期(所以无论调用几次都只能初始化一次)。 (2)static修饰的全局变量(静态外部变量)只能在...

beerbread134 ⋅ 03/21 ⋅ 0

7、变量的生存期和作用域

在C语言中,程序可在任意花括号后定义变量,在C++中,允许在程 序中任何地方声明变量,它的优点是可在使用该变量附近定义他。当在一个块内定义了一个变量,这个变量的作用域是从定义点起到当...

hopegrace ⋅ 2010/08/03 ⋅ 0

C语言编程新手基础入门学习—了解声明与定义

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界 ⋅ 03/19 ⋅ 0

计算机专业C语言编程学习重点:指针化难为易

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界 ⋅ 05/31 ⋅ 0

C语言编程基础学习:函数中的代码尺寸

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界 ⋅ 05/16 ⋅ 0

iOS底层原理总结 - 探寻block的本质(一)

面试题 block的原理是怎样的?本质是什么? block的作用是什么?有什么使用注意点? block的属性修饰词为什么是copy?使用block有哪些使用注意? block在修改NSMutableArray,需不需要添加b...

xx_cc ⋅ 05/20 ⋅ 0

精选的这19道C/C+面试题,你能答对多少呢?

软件工程师的面试,套路都差不多,这一次约到的问题,下次你可能还会遇到。 问1:请用简单的语言告诉我C++ 是什么? 答:C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C++支持...

悟空_b201 ⋅ 06/02 ⋅ 0

期末复习之C语言编程基础知识梳理

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界 ⋅ 03/18 ⋅ 0

C语言程序员编程入门到精通学习基础篇—计算长方体体积—简单的小程序

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界 ⋅ 03/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

vim编辑模式、命令模式

编辑模式 vim要从一般模式进入编辑模式只要按字母 i 、I、a、A、o、O键就可以了 要从编辑模式回到一般模式按键盘上的Esc键即可。 按键 作用 i 在当前字符前插入 I 在光标所在行的行首插入 o ...

黄昏残影 ⋅ 26分钟前 ⋅ 0

OSChina 周五乱弹 —— 如果有一天不当程序员了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @guanglun :分享off的单曲《我唱情歌给你听》 《我唱情歌给你听》- off 手机党少年们想听歌,请使劲儿戳(这里) @小小编辑 :#如果不做程序...

小小编辑 ⋅ 33分钟前 ⋅ 4

从 Confluence 5.3 及其早期版本中恢复空间

如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话。你可以使用临时的 Confluence 空间安装,然后将这个 Confluence 安装实例升级到你现...

honeymose ⋅ 今天 ⋅ 0

Java8新增的DateTimeFormatter与SimpleDateFormat的区别

两者最大的区别是,Java8的DateTimeFormatter也是线程安全的,而SimpleDateFormat并不是线程安全。 在并发环境下使用SimpleDateFormat 为了能够在多线程环境下使用SimpleDateFormat,有这三种...

人觉非常君 ⋅ 今天 ⋅ 0

多线程如何控制执行顺序

线程的生命周期说明: 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、...

MarinJ_Shao ⋅ 今天 ⋅ 0

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Django第一期

安装Django 去https://www.djangoproject.com/download/ 下载最新版的Django,然后解压放到Anaconda\Lib\site-packages目录下,然后cmd进入此目录,输入安装命令: python setup.py install ...

大不了敲一辈子代码 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部