作用域规则

程序中名字的作用域,通俗的讲,就是这个名字在程序中的使用范围。在C语言中,作用域的规则相对比较简单,主要分为 全局作用域局部作用域 两种。

一个变量如果定义在函数中,那么这个变量的作用域就是一个局部作用域,在函数外面不能访问这个变量。在别的函数中定义同名的变量,也不会出现名字冲突,因为它们都处于各自的局部作用域中。

外部变量或函数的作用域是从声明的位置开始,到所在文件的末尾。如果需要在别的文件中引用不在这个文件中定义的外部变量,或者在这个变量定义之前使用,可以通过关键字 extern 进行声明。

*extern *修饰符的作用是,告知该变量已经在别的地方定义了。外部变量和函数默认具有全局作用域,所以可以在程序的任何位置进行引用。


main() { ... }
int sp = 0;
double val[MAXVAL];
void push(double f) { ... }
double pop(void) { ... }

在上面的代码中,sp和val的作用域是从它们定义的位置开始的,所以可以在push和pop函数中引用这两个变量。而在main函数中,不能直接引用这两个变量。如果需要引用在后面定义的变量,可以使用关键字 extern 声明需要使用的变量。在上面的代码中,如果需要在main中使用sp,则可以这样声明:


extern int sp;

声明和定义的区别:声明只是告知这个变量的类型,而定义一个变量,除了告知变量的类型,还会为变量分配存储空间。

在一个程序中,外部变量的定义只能有一处,而外部变量的声明可以出现在任何需要引用这个变量的文件中。通过在文件中使用 extern 关键字声明一个变量,可以使用在别的地方声明的变量。

static修饰符

在C语言中,static修饰符用于定义静态变量。static除了可以修饰变量外,还可以修饰函数。

对于外部变量和函数,static修饰符会限制它们的作用域,使它们只能在定义它们的文件中使用,作用域不能传播到文件外。

使用static修饰符,提供了一种隐藏名字的方式,可以将名字限定在一个文件中,防止名字冲突。


static char buf[BUFSIZE];
static int bufp = 0;
int getch(void) { ... }
void ungetch(int c) { ... }

在上面的代码中,bufp和buf都只能在函数getch和ungetch中使用,而不能在别的文件中使用,即使在别的文件中使用了extern声明。

static修饰符除了可以修饰外部变量和函数外,也可以作用于局部变量。通过static修饰的局部变量,在函数中的存储空间将不会再函数结束后销毁,而是一直存在直到程序结束。当程序再次被调用时,仍旧可以访问这个区域的内存。

C语言的作用域规则的更多相关文章

  1. C语言函数的作用域规则

      “语言的作用域规则”是一组确定一部分代码是否“可见”或可访问另一部分代码和数据的规则. “同一函数中,不同的结构体成员名能相同,当变量处于不同的作用域时,名称可以相同. 注:作用域,其对象是变量, ...

  2. 【C语言入门教程】5.2 函数的作用域规则(auto, static)

    作用域规则是指代码或数据的有效使用范围.C语言将函数作为独立的代码块,函数之间不能相互访问其内部的代码或数据.函数间数据的传递只能通过接口实现.但是,变量的定义方法可改变函数的作用域规则,可将变量分为 ...

  3. C语言基础知识【作用域规则】

    C 作用域规则1.任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问.C 语言中有三个地方可以声明变量:在函数或块内部的局部变量在所有函数外部的全局变量在形式参数的函数参 ...

  4. 新手入门C语言第十章:C作用域规则

    C 作用域规则任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问.C 语言中有三个地方可以声明变量: 在函数或块内部的局部变量 在所有函数外部的全局变量 在形式参数的函数 ...

  5. python3的变量作用域规则和nonlocal关键字

    也许你已经觉得自己可以熟练使用python并能胜任许多开发任务,所以这篇文章是在浪费你的时间.不过别着急,我们先从一个例子开始: i = 0 def f(): print(i) i += 1 prin ...

  6. 【转载】Java与C++语言在作用域上的差异浅析

    http://developer.51cto.com/art/200906/126199.htm 差异一:变量作用域的不同 如下面这段程序代码是符合C++语言的语法要求的.其可以在C语言下正常运行.但 ...

  7. C 作用域规则

    C 作用域规则 任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问.C 语言中有三个地方可以声明变量: 在函数或块内部的局部变量 在所有函数外部的全局变量 在形式参数的函 ...

  8. python_way day10 python和其他语言的作用域 、 python2.7多继承和3.5多继承的区别 、 socket 和 socketserver源码(支持并发处理socket,多进程,多线程)

    python_way day10 1.python的作用域和其他语言的作用域 2.python2.7多继承和3.5多继承的区别 3.socket和socketserver源码(并发处理socket) ...

  9. 黑马程序员-- C语言变量作用域与代码块

    这里通过变量作用域的两种错误用法来介绍一下C语言变量作用域 其次对代码块的使用进行了简单说明: #include <stdio.h> 1.变量的作用域(作用范围) 变量定义的那一行开始,直 ...

随机推荐

  1. spark 1.5.2配置记录

    1)slaves # A Spark Worker will be started on each of the machines listed below. dataNode 2)spark-env ...

  2. sass入门教程

    一.什么是SASS SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护. 二.安装和使用 2.1 安装 SASS是Ruby语言写的,必须先 ...

  3. git branch(git 的branch 使用方法)

    查看分支:         $ git branch    该命令会类出当先项目中的所有分支信息,其中以*开头的表示当前所在的分支.参数-r列出远程仓库中的分支,而-a则远程与本地仓库的全部分支. 创 ...

  4. 1171. Lost in Space

    http://acm.timus.ru/problem.aspx?space=1&num=1171 一天的时间,WA了N遍,居然是因为数组开小了呀,我勒个去!鄙视自己...... 我是从第 1 ...

  5. Office 365 SharePoint Online 学习链接

    Here is an article about how to develop for SharePoint Online(Ofiice 365):http://www.microsoft.com/e ...

  6. win7 64位4GB内存下 tomcat7扩大内存

    新部署的scm项目运行第二天报: Could not retrieve transation read-only status server 无法获取事务只读状态服务器 登录界面输入正确账号密码登录后 ...

  7. 如何在HTML5 Canvas 里面显示 Font Awesome 图标

        Font Awesome 是一套完美的图标字体,主要目的是和 Bootstrap 搭配使用. 提供的CSS 已经可以完美显示这些图标在网页里面.最新的版本4.3 里面,已经提供519 Icon ...

  8. 清除Linux OS 缓存

    1.查看内存使用情况 [root@ip---- tpch_2_17_0]# free -m total used free shared buffers cached Mem: -/+ buffers ...

  9. extjs combobox

    states.js中 Ext.example.states=[ ['AL','ALabama','The Heart of Dixie'], ['AK','Alaska','The Land of t ...

  10. 作业七:团队项目——Alpha版本冲刺阶段004

    今日进展:我们的扫雷基本界面已经差不多了,准备开始编写内部代码. 今日安排:做好界面,准备开始代码编写.