文档章节

C++ 局部静态变量,全局变量,全局静态变量,局部变量的区别和联系

secondtonone1
 secondtonone1
发布于 2016/08/09 18:00
字数 1107
阅读 12
收藏 0
点赞 0
评论 0

C++变量根据定义位置的不同,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域。

从作用域看:

全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包括全局变量定义的源文件需要用extern关键字再次声明这个全局变量。

静态局部变量具有局部作用域。它只被初始化一次,自从第一次初始化直到程序结束都一直存在,即它的生命周期是程序运行就存在,程序结束就结束,

他和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。也就是在别的函数访问这个变量是错误的。

局部变量也只有局部作用域,他是自动对象,他在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用结束后,变量就被撤销,其所占用的内存也被收回。

生命周期在函数结束后就结束了,作用域也仅限于该函数。

静态全局变量也具有全局作用域,他与全局变量的区别在于如果程序包含多个文件的话,他作用于定义它的文件里,不能作用到其他文件里,即被static关键字修饰过的变量具有文件作用域。

这样即使两个不同的源文件都定义了相同的静态全局变量,他们也是不同的变量。

从分配内存空间看:

全局变量、静态局部变量、静态全局变量都在静态存储区分配空间,而局部变量在栈分配空间。

全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上没有什么不同。区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其他源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其他源文件中引起错误。

1、静态变量会被放在程序的静态数据存储区里,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是他与堆栈变量和堆变量的区别,单例模式就是利用这个机制。

2、变量用static告知编译器,自己仅仅在变量的作用域范围内可见。这一点是他与全局变量的区别。

从以上分析可以看出,把局部变量改变为静态变量后是改变了他的存储方式,即改变了他的生存期。把全局变量改变为静态变量后是改变了他的作用域,限制了他的使用范围,

因此static这个说明符在不同的地方起的作用是不同的。

TIPS:

1、若全局变量仅在单个文件中访问,则可以讲这个变量修改为静态全局变量。

2、若全局变量仅在单个函数中使用,则可以将这个变量修改为该函数的静态局部变量。

3、全局变量、静态局部变量、静态全局变量都存放在静态数据存储区。

4、函数中必须要使用static变量的情况:当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,

因为他的生命周期是整个程序运行周期。

© 著作权归作者所有

共有 人打赏支持
secondtonone1

secondtonone1

粉丝 4
博文 38
码字总数 53981
作品 1
东城
高级程序员
[C++再学习系列] 全局或静态变量(对象)的初始化

  对于C语言的全局和静态变量,不管是否被初始化,其内存空间都是全局的;如果初始化,那么初始化发生在任何代码执行之前,属于编译期初始化。由于内置变量无须资源释放操作,仅需要回收内...

技术小美 ⋅ 2017/11/05 ⋅ 0

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

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

beerbread134 ⋅ 03/21 ⋅ 0

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

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

hopegrace ⋅ 2010/08/03 ⋅ 0

const、static变量在内存中的位置

以下面代码说明各变量的存放位置: 我们一般将C/C++内存分为以下五大分区: 全局/静态存储区、栈内存、堆内存、常量存储区(只读数据区)、代码区,以上各变量的存储位置如下: ①、static无...

anda0109 ⋅ 04/10 ⋅ 0

C语言编程学习中,全局变量与局部变量同名时,如何判断

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

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

c/c++内存机制(一)(原)

一:C语言中的内存机制 在C语言中,内存主要分为如下5个存储区: (1)栈(Stack):位于函数内的局部变量(包括函数实参),由编译器负责分配释放,函数结束,栈变量失效。 (2)堆(Heap):由...

xumaojun ⋅ 04/03 ⋅ 0

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

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

悟空_b201 ⋅ 06/02 ⋅ 0

linux c/c++面试知识点整理(二)

11、关联、聚合、组合的区别 主要是在画uml类图时,有关联、聚合和组合的说法。 关联,是一种很弱的联系,指的是两个类之间有某种联系,比如一个类实例作为另一个类方法的参数; 聚合,指的是...

晟夏的叶 ⋅ 2017/04/23 ⋅ 0

C语言局部变量和全局变量问题汇总

1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用"::" 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。...

graylee ⋅ 2013/10/28 ⋅ 0

iOS 面试全方位剖析 -- Block篇

block 介绍 截获变量 block修饰符 Block的内存管理 Block的循环引用 截获变量 先看一个问题 带着问题往下看,有这几种类型的变量 从这段代码来深入了解一下 使用 clang命令看一下编译后的源码...

PetitBread ⋅ 05/28 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

MySQL主从复制原理、半同步操作步骤及原理

1.1 企业Linux运维场景数据同步方案 1.1.1 文件级别的异机同步方案 1、scp/sftp/nc 命令可以实现远程数据同步。 2、搭建ftp/http/svn/nfs 服务器,然后在客户端上也可以把数据同步到服务器。...

xiaomin0322 ⋅ 18分钟前 ⋅ 0

Oracle10g 数据及文件迁移过程[原]

QL*Plus: Release 10.2.0.1.0 - Production on 星期三 5月 11 10:22:35 2011 Copyright (c) 1982, 2005, Oracle. All rights reserved. 连接到: Oracle Database 10g Enterprise Edition Re......

harrypotter ⋅ 23分钟前 ⋅ 0

nginx安装

1:安装工具包 wget、vim和gcc yum install -y wget yum install -y vim-enhanced yum install -y make cmake gcc gcc-c++ 2:下载nginx安装包 wget http://nginx.org/download/nginx-1......

壹丶贰 ⋅ 26分钟前 ⋅ 0

ideaVim安装及配置

1.安装插件 File-Settings-Plugins,Browse Repositories,输入ideavim,安装。 重启后,在Tools-Vim Emulator启用。 2.快捷键设置 ideaViim键与idea快捷键有冲突,可以在Settings-Other Se...

Funcy1122 ⋅ 30分钟前 ⋅ 0

MySQL中B+Tree索引原理

B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引。B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的。在讲B...

浮躁的码农 ⋅ 45分钟前 ⋅ 0

两道面试题,带你解析Java类加载机制

在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Grandpa{ static { System.out.println("爷爷在静态代码块"); }} cl...

1527 ⋅ 49分钟前 ⋅ 0

SpringCloud(Data Flow)

dataflow-server

赵-猛 ⋅ 59分钟前 ⋅ 0

深入理解Java虚拟机

这本书我读到第8章,之后就是在读不下去了。 读到后面是一种痛苦的体验,太多的东西是不全面的,大量的专有名词是没有解释的,读到最后很多东西仅仅是一个侧面,所以我觉得,这本书不适合初学...

颖伙虫 ⋅ 今天 ⋅ 0

NanoPi NEO core/ Ubuntu16.04单网卡配置3个IP地址(2个静态,1个动态)

配置 root@NanoPi-NEO-Core:/etc/network# cat interfacesauto loiface lo inet loopbackallow-hotplug eth0iface eth0 inet static address 172.31.188.249 netmask 255.......

SamXIAO ⋅ 今天 ⋅ 0

三步为你的App集成LivePhoto功能

摘要:LivePhoto是iOS9新推出的一种拍照方式,类似于拍摄Gif图或录制视频片段生成图片。如果没有画面感,可以联想《哈利波特》霍格沃茨城堡的壁画,哈哈,很炫酷有木有,但坑爹的是只有iphone6S以...

壹峰 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部