一、作用域
就是一个变量或者函数起作用的地方。
一个c语言变量的作用域可以是代码块作用域、函数作用域或者文件作用域。
(1)代码块作用域:代码块是{}之间的一段代码。
int main(void)
{
int a = 0;
a = 10;
{
int a = 100;//此处a的作用域是在这个{}范围内
}
printf("a = %d\n", a);//这个a表示的是a=10的值。
return 0;
}
eg2:
int main(void)
{
int a = 0;
a = 10;
{
int a = 100;
printf("a = %d\n", a);
}
return 0;
}
注:出现在{}之外的变量是全局变量
二、变量的存储类型
2.1 变量存储类型的声明:
存储类型 数据类型 变量名;
2.2 C存储类型关键字
1.auto(自动变量):动态局部变量,即一般常用的变量。生存周期:进入语句块时自动申请内存,退出时自动释放。所谓释放即内存中不放那个值,而是随机值
2.static(静态变量):生存周期:静态全局变量:从程序运行起占据内存,程序结束时释放;静态局部变量:进入该函数时占据内存,退出函数时释放内存,但值保留。
3.extern(外部变量):编译器并不对其分配内存,只是表明“我知道了”
4.register(寄存器变量):保存在CPU中,具有运算速度快,容量小的特点。存在时间:程序开始到程序结束
注意:
静态全局变量只能在定义该变量的文件内使用,在别的文件中不能访问
2.2.1 auto关键字
auto 自动变量,c语言的默认变量都是auto,可写可不写。
auto int a = 0;等同于
int a = 0;
2.2.2 静态变量
a.静态局部变量:静态局部变量在函数范围内有效,函数外无效。
int mystatic()
{
int a = 0;
printf("a =%d\n", a);
a++; //a++只能在这个{}内访问
}
int main()
{
int i;
for(i = 0; i < 10; i++)
{
mystatic();
}
return 0;
}
静态变量是指内存位置在程序执行期间一直不改变的变量,一个代码块内部的静态变量只能被这个代码块内部访问。
int mystatic()
{
static int a = 0; //静态变量,只初始化一次(即只在开始时运行了一次,后面不管运行几次都跟它无关),且程序运行期间,静态变量一直存在
printf("a = %d\n", a);
a++;
}
int main()
{
int i;
for(i = 0; i < 10; i++)
{
mystatic();
}
return 0;
}
注:函数通常是全局的,而一旦用static进行限制,即:
static void test()
{
}
那该函数就只能在当前这个文件中使用,不能被别的文件调用。
b. 静态全局变量(即全局变量)
代码块之外的静态变量在程序执行期间一直存在,但只能被定义这个变量的文件访问
2.2.3 extern 跨文件作用域
当想调用另一个文件中的某个变量时,需要用extern在本文件中声明。
比如:想在本文件中调用a.c文件中的mymax变量,在程序的开头加下面这一句
extern int mymax;
不加extern,则表示全局变量。
2.2.4 register寄存器变量
一般的变量大都保存在内存中,如果能把变量放到CPU的寄存器里面,代码执行效率会更高
register int i = 0;//建议,若有寄存器空闲,那么这个变量就放到寄存器里面使用
注:对一个register变量是不能进行取地址操作的