写在开头

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

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

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

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

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

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

作用域类型

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

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

存储类型

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

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

不用限定词的情况

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

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

使用static

 /*例3*/
#include<stdio.h>
static int a=;
int main()
{
static int b=;
return ;
}

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

如例3中的变量a。

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

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

如例3中的变量b。

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

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

使用extern

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

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

使用auto、register

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

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

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

  1. C语言变量的作用域和存储类型

    1.动态局部变量:也称局部变量.自动变量,是指在函数内部定义的自动变量,不带static修饰,作用域是定义该变量的子程序.在退出函数后,变量自带内存会自动释放. 2.静态局部变量:是指在函数内部定义的 ...

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

    全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内 ...

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

    http://www.crifan.com/summary_python_variable_effective_scope/ 解释python中变量的作用域 示例: 1.代码版 #!/usr/bin/ ...

  4. 注意for循环中变量的作用域-乾颐堂

    1 2 for e in collections:     pass 在for 循环里, 最后一个对象e一直存在在上下文中.就是在循环外面,接下来对e的引用仍然有效. 这里有个问题容易被忽略,如果在循 ...

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

    for e in collections: pass 在for 循环里, 最后一个对象e一直存在在上下文中.就是在循环外面,接下来对e的引用仍然有效. 这里有个问题容易被忽略,如果在循环之前已经有一个 ...

  6. C语言中变量的作用域和生命周期

    变量的类型: 1. 局部变量和全局变量 局部变量也称为内部变量. 局部变量是在函数内作定义说明的.其作用域仅限于函数内, 离开该函数后再 使用这种变量是非法的. 全局变量也称为外部变量,它是在函数外部 ...

  7. JavaScript 中变量、作用域和内存问题的学习

    这是我学习JavaScript的第二篇文章,之前做过几年的Java开发,发现JavaScript虽然也是面向对象的语言但是确实有很多不同之处.就本篇博客,主要学习总结一下最近学习到的JavaScrip ...

  8. Delphi过程和函数中变量的作用域

    变量的作用域是指变量能被某一子程序识别的范围. 全局变量和局部变量.全局变量是指在程序的type区定义的变量,而局部变量是在过程或函数的定义部分声明的变量.全局变量在整个程序中都有意义,局部变量只在它 ...

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

    我们知道,函数.类会改变当前变量的作用域.if,while等分支循环结构会继承外部作用域,即外部变量对分支循环结构内部可见. 但是C语言不支持if,while等分支循环结构内部作用域对外可见,而PHP ...

随机推荐

  1. Django之使用中间件解决前后端同源策略问题

    问题描述 前端时间在公司的时候,要使用angular开发一个网站,因为angular很适合前后端分离,所以就做了一个简单的图书管理系统来模拟前后端分离. 但是在开发过程中遇见了同源策略的跨域问题,页面 ...

  2. sql建表经验总结——主要是建表现象

    在建表方面你都有哪些感悟? 见过的建表的一些现象: 1,一对多业务,有时候在主表见一个字段xxIds,然后存多表的id,多个英文逗号隔开,不知道这样好不好? 2,大部分字段建成varchar(50), ...

  3. Fire Balls 05——子弹的命中及后续效果

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  4. StackOverflow 周报 - 与高关注的问题过过招(Java)

    本篇文章是 Stack Overflow 周报的第二周,共收集了 4 道高关注的问题和对应的高赞回答.公众号「渡码」为日更,欢迎关注. DAY1.  serialVersionUID 的重要性 关注: ...

  5. 复习+dfs

    1.参考:https://www.cnblogs.com/ckxkexing/p/8466097.html 这道题自己写过,还写过blog,但是第二次写还是不会. (于是开坑,想做做dfs的整理.

  6. CodeForces 639C Bear and Polynomials

    Bear and Polynomials 题解: 如果改变一个其中的一个数,那么需要知道的是,前面的数都可以进到当前位来,如果过不来的话,那么就会因为前面有数导致无法变成0. 所以我们将前面的数不断向 ...

  7. codeforces 735C. Tennis Championship(贪心)

    题目链接 http://codeforces.com/contest/735/problem/C 题意:给你一个数n表示有几个人比赛问最多能赢几局,要求两个比赛的人得分不能相差超过1即得分为2的只能和 ...

  8. 计蒜客 ACM训练联盟周赛 第一场 Christina式方格取数 思维

    助手Christina发明了一种方格取数的新玩法:在n*m的方格棋盘里,每个格子里写一个数.两个人轮流给格子染色,直到所有格子都染了色.在所有格子染色完后,计算双方的分数.对于任意两个相邻(即有公共边 ...

  9. codeforces 766 D. Mahmoud and a Dictionary(种类并查集+stl)

    题目链接:http://codeforces.com/contest/766/problem/D 题意:给你n个单词,m个关系(两个单词是反义词还是同义词),然后问你所给的关系里面有没有错的,最后再给 ...

  10. HTTPS页面使用CNZZ统计代码,Chrome显示警告怎么办?

    很多站长会遇到一个问题,网站加入CNZZ的JS统计代码后,Chrome浏览器出现警告:阻止跨站解析器阻断脚本通过document.write调用(A parser-blocking, cross si ...