作用域
作用域是什么?
一个对象起作用的范围。
变量(包含数组)
函数
类型
…
一个C语言程序(工程),可以包含多个.c和.h文件。
那么咱们可以将作用域分为几种情况:
a、整个工程作用域
在工程的所有文件中,都可以起作用。
b、本文件作用域
只在本文件(.c/.h)中起作用。
c、函数作用域/代码块作用域
仅在{}内起作用。
变量的作用域
(1) 全局变量: 定义在函数外面的变量
作用域: 整个工程作用域
1.c
int a = 5; //全局变量
2.c
在2.c中也可以使用1.C中a
(2) static修饰全局变量 (静态全局变量)
定义在函数外部的变量,只不过前面加了一个 static
static修饰全局变量,使得被修饰的全局变量的作用域发生改变,变成仅在本文件中有效!
1.c
static int a=5;
2.c
在2.c使用不了(即使使用外部声明也不行)
(3) 局部变量: 定义在{}内的变量,局部变量
局部变量的作用域: 代码块作用域
局部变量仅在定义它的{}内 “可见”
函数的作用域
(1) 整个工程作用域
1.c
int sum(int a, int b)
{
return a+b;
}
2.c
如果需要在2.c中去调用1.c的sum函数
只需在2.c中对sum函数进行声明
extern int sum(int a, int b) ;
(2) 本文件作用域
static修饰函数,会使得被修饰的函数的作用域变成 仅在本文件中有效。
1.c
static int sum(int a, int b)
{
return a+b;
}
2.c
与变量作用域一样
extern int sum(int a, int b) ;外部声明也不行
类型的作用域
typedef :用来声明一个新的类型名
给一个已经存在的类型取一个别名。
typedef 存在的类型 新的类型名;
例子:
typedef int int32;
int a;
<=> int32 a;
(1) 本文件作用域
1.c
typedef int int32;
那么可以在整个1.c中去使用int32
2.c
如果在2.c中要使用 int32 这个类型名
必须要在2.c中 typedef int int32;
(2) 代码块作用域
{
typedef char char_8;
char_8 A;
}
{
char_8 B;
}
思考题:
1.c
int a = 5;
int main()
{
printf("%d\n", a); //5
int a = 6;
printf("%d\n", a); //6
if(1)
{
int a = 7;
printf("%d\n", a); //7
}
printf("%d\n", a); //6
}
就近原则
生存期
是指一个对象从生到消亡的期间。
随文件系统持续性:
只要文件系统在,那么这个对象就一直存在。
如: 代码文件
随进程持续性:
进程: 一个正在运行的程序。
是指这个对象,在进程启动的时候,他就存在,并且一直持续到进程消亡。
进程启动时,就会给那些“随进程持续性”的对象,分配空间,并且这个空间
会一直持续到进程消亡。
如:
全局变量
函数
static修饰的局部变量(静态局部变量)
随代码块持续性:
是指这个对象,在运行它所属的代码块时,才分配空间给它,
并且当代码块执行完毕时,它的空间就会被自动回收。
如: 普通局部变量
“初始化” 和"初始化语句"
定义一个对象时,就给它赋值的语句,“初始化” “初始化语句”
初始化:
就是在给对象分配空间时,就会赋值。
初始化语句 :
只会在给对象分配空间时,执行一次。
Linux进程空间布局:
分段:
.data
.bss
.rodata
…
堆
栈
static 在C语言中的作用:
(1) static用于修饰全局变量或函数,作用是:
使得被修饰的全局变量或函数的作用域 变为仅在本文件中有效。
(2) static用于修饰局部变量,作用是:
使得被修饰的局部变量的生存期 随进程持续性。