auto型变量:只能用于局部变量,局部变量默认情况下即为auto型。它会为变量在栈上分配空间。
注意:auto型变量不能用于全局型变量,因为全局型变量是在内存的静态存储区(全局存储区)上分配的空间,即堆空间上分配。
register型变量:寄存器型变量是将变量存放在寄存器当中,register只是请求寄存器变量,但不一定请求成功。
注意:1. register变量必须是CPU寄存器可以接受的值(如32位机器,只能存放32位即4字节的变量)。 2. 不能用&运算符获取register变量的地址(因为register变量存放在寄存器当中,而&是从内存地址当中取值,所以无法成功)。
static型变量:将变量存放在静态存储区,经常用于局部变量中,当局部变量被声明为static时,虽然其的作用域仅仅是自其函数内部,但整个变量在整个程序运行过程中都有效。而且此static局部变量仅仅赋初值一次(在第一次调用此局部变量所包含于的函数时)。
注意:static的另一个意义是文件作用域表示符。(1.static修饰的全局变量的作用域只是声明的文件中。2. static修饰的函数作用域只是声明的文件中),
下面举例说明上述几种变量使用出错实例(紫色部分为出错位置):
实例1:
#include <stdio>
auto int a=0; //auto只能用于修饰局部变量,它是用于将变量存放在栈中,而非全局存储区
register int b=0; /*因为静态存储区的变量一旦设定,在整个程序运行范围内都有效。如果将好几个全局变量都设为register型变量,则对应的这些寄存器在整个程序运行周期中就只能放这个全局变量了。占用很多个不同寄存器,而CPU的寄存器是有限的,很容易导致寄存器被使用完导致崩溃,所以编译器不允许将register型变量放在全局变量区。*/
int main()
{
auto int i=0;
auto int j=0;
auto int k=0;
printf(“%0X\n”,&i);
printf(“%0X\n”,&j); //因为register变量存放在寄存器当中,而&是从内存地址当中取值,所以无法成功
printf(“%0X\n”,&k);
return 0;
}
作用域限定符:
test.c
#include <stdio>
extern int test2_g;
extern int test2_func();
extern int test2_ff();
int main()
{
printf("%d\n",test2_g); /*因为test2_g在文件test2.c当中是static型全局变量(作用域限定符),所以只能在test2.c文件中被访问。*/
printf("%d\n",test2_func()); //同上理
printf("%d\n",test2_ff());
return 0;
}
test2.c
static test2_g=1;
static int test2_func()
{
return test2_g;
}
int test2_ff()
{
return test2_func();
}