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修饰的局部变量,作用是:
使被修饰的局部变量的生存期,随进程持续性。
作用域与生存期
最新推荐文章于 2021-03-31 21:37:12 发布