C/C++中变量的作用域和存储类型简介

写在开头

对于很多C/C++的初学者来说,很容易理不清变量的作用域和存储类型这一块的一些概念,也容易将其中的一些概念搞混淆。作为一个C/C++的初学者,笔者希望在这里能够尝试着去理一理这些较为繁杂的概念,主要当作自己备忘之用。当然,由于笔者水平有限,经验不足,在这里也只能罗列一些常用概念和使用方法,且可能会有些许不专业之处,望君理解并指正。

一定要把变量的作用域和存储类型分开来看

很多人很容易把变量的作用于和存储类型搞混,但其实只要我们从它们定义出发来看,这个问题是很容易解决的。作用域是一个变量能够被使用的范围,而存储类型则是变量的存储方式,且存储类型决定着变量的生存期。

通俗地讲,存储类型决定着一个变量在某位置存不存在,而作用域决定着一个变量在某位置能不能被使用。比如:

1 /*例1*/
2 #include<stdio.h>
3 int main()
4 {
5     static int a=1;//定义了一个静态存储的局部变量
6     return 0;
7 }

a是一个采用静态存储的局部变量,像这样的变量在整个文件中都不会消失,但是只能在main()函数内被使用。

作用域类型

在C语言中有块作用域函数作用域函数原型作用域以及文件作用域,在C++中还有类作用域命名空间作用域。由于在各类资料中关于这几类作用域的介绍已经相当丰富,在此我就不展开介绍了。在这几类作用域中,除了函数作用域均可根据名称来理解,如“具有块作用域”就是说明该变量在对应代码块(一般来说就是大括号里包起来的部分,可以省略大括号的for语句、if()语句等除外)中能够被使用。

函数作用域仅用于goto语句的标签,由于goto语句已经用得很少,在此笔者不再对函数作用域进行展开介绍。

存储类型

存储类型分为静态存储动态存储,采用静态存储方式的变量一旦创建,其存储空间在整个程序的运行过程中都不会被释放。对于采用动态存储的变量来说,当进入该程序块(函数或复合语句等)时,建立该变量,分配存储空间,当退出该程序块时,撤销该变量,释放其存储空间。

在接下来的一部分内容里,笔者将按照不同的限定词来对各种常见情况进行分别描述。

不用限定词的情况

1 /*例2,不用限定词的情况*/
2 #include<stdio.h>
3 int a=1;//a为全局变量,采用静态存储
4 int main()
5 {
6     int b=1;//b为局部变量,默认采用动态存储
7     return 0;
8 }

全局变量a采用静态方式存储,具有文件作用域,b采用动态方式存储,具有的是块作用域。

使用static

1 /*例3*/
2 #include<stdio.h>
3 static int a=1;
4 int main()
5 {
6     static int b=1;
7     return 0;
8 }

在程序块外使用static来定义变量  

如例3中的变量a。

对于全局变量来说,加不加static,该变量都采取静态方式来存储,但是加了static之后,该变量便变成了“内部变量”,即该变量只能在该文件内被使用。不加static的全局变量默认为“外部变量”,可以被其他文件在进行了引用申明(用extern,稍后介绍)后使用。

在程序块内使用static来定义变量

如例3中的变量b。

对于定义局部变量来说,如果不加任何修饰词,则该变量默认为自动变量,采取动态方式进行存储。在用static进行修饰的变量定义中,该变量将采取静态方式进行存储,而且其初始化在编译时进行,且只会进行一次。

但是,不管加不加static,在程序块内定义的变量都只具有块作用域。

使用extern

 1 /*例4 part 1*/
 2 /*file 1.c*/
 3 #include<stdio.h>
 4 int a=1;
 5 static int b=1;
 6 int main()
 7 {
 8     extern int c;//对于全局变量c做提前引用说明
 9     printf("%d",c);
10     return 0;
11 }
12 int c=1;
 1 /*例4,part 2*/
 2 /*file 2.c*/
 3 #include<stdio.h>
 4 extern int a;//对全局变量a做引用申明
 5 extern int b;//本行错误,因为b仅在file 1.c中有效
 6 int main()
 7 {
 8     printf("%d",a);
 9     return 0;
10 }

extern仅用于对全局变量进行引用声明,其中包括对在定义在使用处后边的全局变量做提前引用声明(如例4 part 1 第8行),也包括在一个文件中对另一个文件里定义的全局外部变量做引用声明(如例4 part 2 第4行)。

使用auto、register

使用auto可显示地声明自动变量,由于在程序块内声明的变量默认是auto的,所以auto更多地也就只是起到一个标记的作用了。

使用register可以将一些将被频繁使用的局部变量放到寄存器中,这样可以提高程序执行的效率。

原文地址:https://www.cnblogs.com/scwjy/p/10989629.html

时间: 2024-10-10 04:54:22

C/C++中变量的作用域和存储类型简介的相关文章

C语言入门(十四)变量的作用域和存储类型

变量的作用域和存储类型 一.作用域和生存期 C程序的标识符作用域有三种:局部.全局.文件.标识符的作用域决定了程序中的哪些语句可以使用它,换句话说,就是标识符在程序其他部分的可见性.通常,标识符的作用域都是通过它在程序中的位置隐式说明的. 1.局部作用域 前面各个例子中的变量都是局部作用域,他们都是声明在函数内部,无法被其他函数的代码所访问.函数的形式参数的作用域也是局部的,它们的作用范围仅限于函数内部所用的语句块. void add(int); main() { int num=5; add(

C变量和函数的存储类型

C变量和函数的存储类型 在上一篇<C程序内存管理>的文章中,已经知道了C语言编译后的可执行文件的存储结构以及运行时的内存布局,本文则记录C语言中变量和函数的存储类型,以及在内存中的一些行为. C语言中变量的声明/定义格式如下: 存储类型    类型修饰符    数据类型    变量名; 存储类型:用来指明变量的存储位置,即运行该变量在哪一段分配内存空间,常见的存储位置有auto.extern.register.static,在一段执行程序中,可以为变量分配存储空间的有BSS.数据区.栈区.堆区

JavaSript中变量的作用域 闭包的理解

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> /* * 1.js中的变量都是公用的. 2.js中没有静态变量 3.闭包:函数内部可以调用函数外部的变量;反之,则不行 */ var r=10; fu

C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期

全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内存分布:全局数据区 注意:如果在两个文件中都定义了相同名字的全局变量,连接出错:变量重定义 全局静态变量 作用域:文件作用域(只在被定义的文件中可见.) 生命周期:程序运行期一直存在 内存分布:全局数据区 定义方法:static关键字,const 关键字 注意:只要文件不互相包含,在两个不同的文件中

注意for循环中变量的作用域

for e in collections: pass 在for 循环里, 最后一个对象e一直存在在上下文中.就是在循环外面,接下来对e的引用仍然有效. 这里有个问题容易被忽略,如果在循环之前已经有一个同名对象存在,这个对象是被覆盖的. 如果在有代码感知的IDE中, IDE会提示变量是“被重新声明的”, 但运行时却不会出错. for循环不是闭包,可以使用dis模块分解以下代码可以看到: x = 5 for x in range(10): pass print x 将代码保存到test.py文件,运

Python中变量的作用域(variable scope)

http://www.crifan.com/summary_python_variable_effective_scope/ 解释python中变量的作用域 示例: 1.代码版 1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 """ 4 ------------------------------------------------------------------------------- 5 Function: 6 [整理

if、while中变量的作用域问题

我们知道,函数.类会改变当前变量的作用域.if,while等分支循环结构会继承外部作用域,即外部变量对分支循环结构内部可见. 但是C语言不支持if,while等分支循环结构内部作用域对外可见,而PHP则不然. 在PHP中,if,while等分支循环结构中声明的局部变量,在分支循环结构后面仍然有效. 比如,函数中声明的变量在函数外面是不可见的 C语言:01 #include<stdio.h>02  03 int foo()04 {05     int bar;06     bar  = 3;07

C和指针 3.9作用域、存储类型示例

1 int a = 5; 2 extern int b; 3 static int c; 4 5 int d( int e ) 6 { 7 int f = 15; 8 register int b; 9 static int g = 20; 10 extern int a; 11 ... 12 { 13 int e; 14 int a; 15 extern int h; 16 ... 17 } 18 ... 19 { 20 int x; 21 int e; 22 ... 23 } 24 ...

C语言第九回合:作用域和存储类型

C语言第九回合:作用域和存储类型  [学习目标] 1.        局部变量 2.        全局变量 3.        存储类型 4.        内存 A: 局部变量 局部变量也称为内部变量.局部变量是在函数内定义说明. 作用域:仅在声明的函数或复合语句内内,有效区也在函数或复合语句内. B: 全局变量 全局变量也称为外部变量,是在函数外定义的变量. 作用域:整个与程序文件 PS: 局部变量和全局变量是按照作用域来划分的. #include <stdio.h> int numub