作用域与生存期

1.作用域
什么是作用域?
	一个东西(对象)起作用的范围。
	
	变量(包含数组) 的作用域
	函数              的作用域
	类型             的作用域 

你知道的,一个C程序(C工程),可以包含多个.c 
作用域可以分成几种:
	整个工程作用域
		在工程的所有的文件中,都可以起作用
	本文件作用
		只在本文件(.c .h)内起作用
	函数作用域/代码块作用域
		仅在{}内起作用
-------------------
根据变量的作用域不同,分成如下几种类型的变量:
1)全局变量:作用域 是整个工程起作用 
	定义在函数外面的变量 
		1.c
			int a=5;//全局变量
		2.c
			在2.c中也可以使用1.c中的a
			extern int a;//声明外部变量
2)static修饰的全局变量
	定义在函数外面的变量,只不过前面加了一个static
	static修饰的全局变量,使得被修饰的全局变量的
	作用域仅在本文件中有效。
	
	1.c
		static int b=5;//static全局变量
	2.c 
		想要在2.c中使用1.c中的b 
		呵呵,肯定做不到
		extern int b;//?????
3)局部变量
	定义在{}内的变量,局部变量
	局部变量的作用域:代码块作用域
		局部变量仅在定义的{}内 “可见”
	
	{
		int a=5;
		if(1)
		{
			int b=6;
		}
		printf("%d\n",b);
	}
-------------------------------------------
函数作用域
	1)整个工程作用域
		1.c 
			int sum(int a,int b)
			{
				return a+b;
			}
		2.c
			extern int sum(int a,int b);
			//extern int sum(int,int);
			在2.c中就可以使用sum这个函数啦
	2)本文件中作用域 
		1.c 
			static int sum(int a,int b)
			{
				return a+b;
			}
			static 修饰函数,表明被修饰的函数仅在本文件
			内有效
		2.c
			extern int sum(int a,int b);
			给你一个眼神,你懂得
	---------------------------------------------
		类型作用域:
		1)本文件作用域
		1.c 
			struct test
			{
				int a;
				int b;
			};
			在1.c中都可以使用类型 struct test 
		2.c 
			如果在2.c中要使用struct test,则必须
			在2,c中也要定义 struct test 
			struct test
			{
				int a;
				int b;
			};
		2)局部作用域
		{
			struct test
			{
				int a;
				int b;
			};
			struct test仅在定义它的{}内可见。
		}
--------------------------------------------------
思考:
	1.c
	int a=5;
	int main()
	{
		int a=6;
		if(1)
		{
			int a=7;
			printf("a=%d\n",a);//7
		}
		printf("a=%d\n",a);//6
	}
	
	同名不要紧,
	只要域不同, 域:作用域 
	具体是哪个,
	往上就近找。“就近原则”
		--小明
-----------------------------------------------------
2.生存期
	什么是生存期?
		是指一个对象从生到死的期间
		
	随文件系统持续性
		只要文件系统在,那么这个对象就一直存在
		如:
			代码(代码文件)
			
	随程序持续性
	随进程持续性
		进程:一个正在运行的程序
		是指这个对象,在进程启动的时候,它就存在
		并且一直持续直到进程消亡。
		进程启动的时候,就会给哪些“随进程持续性”的对象
		分配空间。
		而且这个空间会一直持续到进程消亡为止。
		
		随进程持续性的对象有哪些呢?
			全局变量 
			函数(代码)
			static修饰的局部变量  <------
						
	随代码块持续性
		是指对象,在运行它所属的代码块的时候,才会分配
		空间给它,并且当代码块执行完毕之后,它的空间
		就会自动回收。
		
		普通的局部对象
	-----------------------------------
	“初始化” “初始化语句”
		定义一个对象时,就给它赋值的语句,“初始化”
		“初始化语句”。
		初始化:就是在给对象分配空间的时候,才会赋的值。
		初始化语句:只会在给对象分配空间的时候执行一次。
		
		int a=5;//初始化语句
		a = 5;//赋值语句
练习:
	分析如下代码的输出结果
	void f()
	{
		int a = 7;
		a++;
		printf("a=%d\n",a);
	}
	
	main()
	{
		f();//a=8
		f();//a=8
	}
-------------------------------	
	void f()
	{
		static int a = 7;
		a++;
		printf("a=%d\n",a);
	}
	
	main()
	{
		f();//a=8 //a=8
		f();//a=8 //a=9
	}

分段:
	.data
	.bss
	.rodata
	...
	堆
	栈
		统统会在第二阶段的进程 中讲 
	
static <------- 
在C语言中只有两个作用:
	1)static用于修饰全局变量和函数的时候,作用是:
		使被修饰的全局变量和函数的作用域,变成
		仅在本文件中有效。
		
	2)static修饰的局部变量,作用是:
	使被修饰的局部变量的生存期,随进程持续性。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值