一、标识符的作用域与可见域
1.作用域和可见域
a.生效的范围称为作用域,
b.程序运行到某一点时,是否可见 成为可见域
2.全局作用域和局部作用域
a.全局作用域
声明并不在花括号内部,在花括号外的都成为全局作用域。
b.局部作用域
声明在花括号内部。
注意:
1.标识符必须先定义再使用;
2.同一作用域中不得出现同名标识符;
3.在没有包含关系的不同作用域中定义的同名标识符互相不影响;
4.在两个或多个具有包含关系的作用域中定义的同名标识符外层标识符在内层中不可见。
代码示例如下:
二、全局变量和局部变量
1.全局变量和局部变量的定义
a.全局变量
全局变量是定义在函数之外定义能够在整个程序中使用的变量,代码示例如下:
#include<stdio.h>
int a,b;
int main(void)
全局变量未被初始化一定是0,这是因为a不在栈区,而是在全局区(静态区),C语言规定,若全局未被初始化,则全局变量的内存空间统一清空。
采用全局变量会导致代码的耦合性过高
所有的函数名具有全局作用域。
b.局部变量
局部变量全部被定义在栈区。
int add(int a,int b)
{
int c;
}
上述代码所定义变量均为局部变量。
具有局部作用域,可以理解为在函数内部定义并只能在函数内部使用的变量。
变量从诞生,到被销毁的时间周期成为变量的生存期。
2.变量的生存期
a.静态生存期
某个变量的生存期与程序运行的时间相同,这样的生存期称为静态生存期。
全局变量就具有静态生存区
int g,i; //在定义时诞生
int main(void)
{
return; // 在程序的最后一个语句执行后进行销毁
}
b.动态生存期
局部变量具有动态生存期。
三、register
register是一种建议,也就是说所定义变量不一定在寄存器内部,代码示例如下:
register int i[1024 * 1024 * 10];
这样编译并不会进行报错,所以定义的变量并不是全部在寄存器内。
注意:
被register所修饰的变量不能进行取地址操作,但是寄存器是在CPU内部,没有地址可以供给查询,所以会产生编译报错。
四、extern关键字
extern所修饰的语句,算声明不算定义:
声明时不能进行初始化,会导致编译报错
五、static关键字
1.若在局部变量前增加static关键字进行修饰,则局部变量的生存期就会变为动态生存期,
使其内存存储空间从栈区变为静态区,代码示例如下:
static int i ;
2.若使用static对全局变量或者函数进行修饰,会使所修饰变量或函数仅限所处文件能够使用,在别的文件中不能对其进行调用