全局变量和局部变量

全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。只有在函数内经过说明的全局变量才能使用。但是在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。
如何在不同文件中引用一个已经定义过的全局变量?可以用引用头文件的方式,也可以用extern关键字。下面的代码给出了使用extern引用已经定义的全局变量的例子。

//file_1.c
int counter; //全局变量counter
//file_2.c
extern int counter; //使用file_1中的counter
++counter; //file_1中的counter自增1

局部变量指在程序中,只在特定过程或函数中可以访问的变量,是相对全局变量而言。在c等面向过程语言中,局部变量可以和 全局变量重名,但会屏蔽全局变量。在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。
在同一个文件中,当局部变量屏蔽了全局变量,而又想要使用全局变量时,有两种方法。一种是使用作用域操作符"::",一种是使用"extern"。

int count = 3;
int main(void)
{
	int i, sum, count=2;
	for (i=0, sum=0; i < count; i+=2, count++) {
		static int count = 4; //只初始化一次
		count ++;
		if (i%2 == 0){
			extern int count;
			count++;
			sum += count ; //语句1
		}
		sum += count; //语句2
}
printf("%d %d \n", count , sum);
return 0;
}

解答:4 20. 主要考查各个count的作用范围,for循环判断条件的count是main下第一行的count,for循环里面的count是static的count,if语句里面的count是main外部的count(extern int count 语句的作用),语句2中的count是static的count,printf语句中的count是main下第一行的count。若将if循环中的语句替换如下,答案也是相同的。

if (i%2 == 0) {
	//extern int count;
	::count++;
	sum += ::count;
}

下面有关volatile说法正确的有?
正确答案: A B C 你的答案: D (错误)
A当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后再取变量值时,就直接从寄存器中取值
B优化器在用到volatile变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份
Cvolatile适用于多线程应用中被几个任务共享的变量
D一个参数不可以既是const又是volatile

volatile:易变的,不稳定的,作用是避免编译器优化。volatile用来声明那些可能在你的程序本身不知道的情况下会发生改变的变量。

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
对于一般变量:为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中。以后再取变量值时,就直接从寄存器中取值。

一个参数既可以是const也可以是volatile:一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。(简单点就是该程序代码不能试图去修改它,但不排除硬件方面修改了它,我们每次都得重新读取它的值。)

几个应用例子:
a. 并行设备的硬件寄存器(如:状态寄存器)。
b. 一个中断服务子程序中会访问到的非自动变量。(个人理解:中断服务子程序不能用缓存在寄存器中的值来判断事件,因为那个值可能被修改了,需要重新读取。所以一般需要把这种变量声明为volatile。)
c. 多线程应用中被几个任务共享的变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值