变量:变量名由字母、数字和下划线组成,不能以数字开头,不得与C语言中关键字,如int、char重名;
在程序运行时,变量占据存储空间的大小由其数据类型决定;变量名从某种意义上来说,就是存储空间
给与用户的抽象定义;
变量在内存中的首地址,称为变量的地址;
变量的定义:在使用时,必须预先说明它们的存储类型和数据类型,定义的一般形式为:
<存储类型> <数据类型> <变量名>
存储类型关键字分别为auto、register、static、extern,下面让我们分别介绍
1.auro 说明的变量只能在某个程序范围内使用,通常在函数体内或函数的复合语句内,如果用户不给定
初始值,则默认为随机值;如auto int k; 则K为int取值范围内的随机值;
下面我们来举例说明:
编译以上程序,系统会给出随机的值,并给予警告未初始化;
再让我们看下别的例子,如下面这个程序:
编译程序,程序第9行报错变量a未经定义,由此可见,auto修饰的变量只能在其程序范围内使用,我们通常
称之为局部变量;
2.register称为寄存器型,register变量是想将变量放入CPU的寄存器中,这样可以加快程序的运行速度,如果
申请不到就使用一般内存,这时同auto;
register变量必须时能被CPU所接受的类型,这通常意味着register变量必须是一个单个的值,并且长度应该
小于等于整型int的长度,如CPU本身是32位,另外,使用register定义的变量不能用&来获取地址;
下面我们来看一个例子:
如上程序编译报错,register修饰的寄存器变量不得使用&来寻址;
3.static存储类型:称为静态存储类型的变量,可在函数内外均可使用,通常称之为全局变量,如果未赋初值,
则系统默认为0;
它有以下特点:在内存中以固定地址存放的,而不是以堆栈的形式存放,只要程序没结束,就不会随着定义
它的程序结束而消失,它下次再调用函数,该函数变量不再重新说明,而且还保留上次调用存入的值;
下面我们看一个例子:
变量每次进入while循环后,变量均会初始为0;下面将变量使用static修饰,让我们看下结果:
4.extern存储类型:当变量再一个文件中的函数体外说明,所有其他文件中的函数或程序段均可引用
这个变量;一般称为外部参照引用型,使用extern修饰的变量是想引用在其他文件中函数体外部说明
的变量;
通俗的来讲,就是在文件1中声明定义了变量a,如果想在文件2中使用变量a,那变量a前面必须使用
exern修饰,否则无法使用,并且编译时必须将两个文件一起编译;下面我们来看一个例子:
上面是两个程序extern.c和extern1.c两个文件中的程序,必须在程序中使用extern修饰变量a
另外值得提的是:gcc编译时,需要将有关系的文件放在一起编译;
在程序文件中,如果使用了外部声明的变量,要在变量前加extern;
static修饰的全局变量,其他文件无法使用;下面我们看下例子: