作用域规则

程序中名字的作用域,通俗的讲,就是这个名字在程序中的使用范围。在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. 四核exynos4412开发板使用网线上网注意事项

    问:RP4412开发板板子可以插网线上网? 答:可以.支持WIFI.LAN.3/4G上网的.插网线没? 问:我插了,他还是提示让我连wifi. 答:你是上网页还是其他的APP. 网页可以直接打开,有部 ...

  2. MYSQL数据库日志和mysqlbinlog相关

    mysql有4种不同的日志,分别是二进制日志,查询日志,慢查询日志和错误日志,这些日记记录着数据库工作的方方面面,可以帮助我们了解数据库的不同方面的踪迹,下面介绍二进制日志的作用和使用方法. 1.二进 ...

  3. 使用 MySQL 查找附近的位置

    使用 MySQL 查找附近的位置 以下 SQL 语句将会在与坐标 37, -122 相距 25 英里的半径范围内查找最近的 20 个位置.该语句根据行的纬度/经度以及目标纬度/经度计算距离,然后只请求 ...

  4. android学习之ListView

    移通152余继彪 该组件用于显示列表的view  包含了三个关键元素 listView 适配器 以及数据,适配器主要是用于将数据映射到listview,适配器数据主要是有hasmap 配合list对每 ...

  5. open nms安装教程

    而在正式的任务,我被要求在Windows平台上部署开源网络管理系统.虽然工作的任务,我得到了一些问题,对此我无法在网上寻找解决的问题,我用的命中和试验方法得到了解决.然后我想就这些问题及其解决办法写. ...

  6. C# UdpClient使用Receive和BeginReceive接收消息时的不同写法

    使用Receive(同步阻塞方式), 注意使用同步方法时,需要使用线程来开始方法,不然会使UI界面卡死 IPEndPoint RemoteIpEndPoint = ); UdpClient udpCl ...

  7. MFC-01-Chapter01:Hello,MFC---1.2 MFC简介

    1.2 MFC简介 MFC是Microsoft提供的放置Windows API的面向对象的包装的C++类库.MFC大约封装了好几百个类,其中有一些可以直接调用,有些类可以作为用户自己的类的基类.一些M ...

  8. Result Maps collection does not contain value for java.lang.Integer异常处理

    使用Mybatis的时候出现这个问题是因为配置文件的问题造成的,mybatis需要写大量的配置文件, 尽管有mybatis-generator,但是里面的内容有很多还是要自己去写的,在这过程中难免会出 ...

  9. Java对象的XML序列化(转)

    转自:http://westlifesz.javaeye.com/blog/48618 java.io.Serializable引发的问题——什么是序列化?在什么情况下将类序列化?  序列化就是一种用 ...

  10. redis清空缓存

    进入redis命令行 首先启动redis服务 redis-server /home/redis/redis_7901.conf redis-cli -p 7901(指定进入端口号为7901的redis ...