C语言变量作用域

本文详细介绍了C语言中的变量作用域,包括块作用域、函数作用域、函数原型作用域和文件作用域,并阐述了变量的链接属性如外部链接、内部链接和空链接,以及四种储存期:静态储存期、线程储存期、自动储存期和动态分配储存期。通过理解这些概念,能更好地掌握C语言中变量的生命周期和使用规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

变量作用域

1.作用域

作用域描述程序中可访问标识符的区域。一个C变量的作用域可以是块作用域,函数作用域,函数原型作用域或文件作用域。

  • 代码块作用域
    代码块是指一对花括号之间的代码,函数的形参虽然是在花括号之前定义,也属于代码作用域。
    声明在内层块中的变量,其作用域仅局限在该声明所在的块:
int fun(int a){
	int i;
	for(i = 0; i < a; i++){
		double q     //q作用域的开始
		...
	} 				//q作用域结束
}

在这个例子中,q的作用域只在内层块,只有内层块中的代码才能访问q。
在C99中,把块的概念扩展到for循环,while循环,do-while循环和if语句所控制的代码当中。即使没有这些代码用花括号括起来,也算是块的一部分。

for(int i = 0; i < n; i++)// i的作用域仅限于for循环。一旦程序离开for循环,就不能再访问i
	printf("%d", i);
  • 函数原型作用域
    用于函数原型中的形参名:
int fun(int a, int b);

函数原型作用域的范围是从形参的定义处到原型声明结束。编译器在处理函数原型中的形参时只关心它的类型,形参名则无关紧要。

  • 文件作用域
    变量的定义在所有函数的外面。具有文件作用域的变量,从它的定义处到该定义所在的文件的末尾均可见。
#include<stdio.h>
int a = 2;//a具有文件作用域
void fun(void){
	...
}
int main(void){
	...
}

这个例子中,a具有文件作用域,main()fun()都可以使用它。由于这样的变量可以作用于多个函数,所以文件作用域变量也称作全局变量

2.链接

C变量有三种链接属性:外部链接,内部链接或空链接。外部链接变量可以在多文件程序中使用,内部链接变量只能在一个翻译单元(一个源代码文件和它所包含的头文件)中使用。

  • 空链接
    具有块作用域,函数作用域或函数原型作用域的变量都是无链接作用域。这意味着他们是由其定义所在的代码块或函数原型所私有。
int a = 1;			 //文件作用域,外部链接
static int b = 2; 	//文件作用域,内部链接
int main(){
	int a = 3;      //空链接,仅为main函数私有
	...
}

3.储存期

作用域和链接描述了标识符的可见性。储存期描述了通过这些标识符访问对象的生存期。
C对象有4种储存期: 静态储存期,线程储存期,自动储存期,动态分配储存期。

  • 具有静态储存期的对象在程序执行期间一直存在。具有文件作用域的变量具有静态存储时期。对于文件储存变量来说,关键字static表明了它的连接属性而非储存期

  • 具有代码块作用域的变量一般情况下具有自动存储时期。在程序进入定义这些变量的代码块时,将为这些变量分配内存,当退出这个代码块时,分配的内存将被释放。

  • 储存类别

储存类别储存期作用域链接声明方式
自动自动空链接块内
寄存器自动空链接块内,使用关键字register
静态外部链接静态文件外部链接所有函数外
静态内部链接静态文件内部链接所有函数外,使用关键字static
静态空链接静态空连接块内,使用关键字static
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值