美国国家标准协会ANSI(American National Standards Institute)C标准C语言共有32个关键字,关键字由系统定义,不能重做其它定义。
1.auto 声明自动变量 只在定义它们的时候才为变量创存储空间,在定义它们的函数返回时系统回收变量所占存储空间。对这些变量存储空间的分配和回收是由系统自动完成的。一般情况下,不作专门说明的局部变量,均是自动变量。自动变量也可用关键字auto作出说明,如今可以省略关键字auto所以很少使用此关键字。自动变量只有一种存储方式,就是存储在栈中。由于自动变量存储在栈中,所以自动变量的作用域只在函数内,其生命周期也只持续到函数调用的结束。
什么是自动变量呢?自动变量就是指在函数内部定义使用的变量。他只是允许在定义他的函数内部使用它。在函数外的其他任何地方都不能使用的变量。自动变量是局部变量,即它的区域性是在定义他的函数内部有效。当然这说明自动变量也没有链接性,因为它也不允许其他的文件访问他。由于自动变量在定义他的函数的外面的任何地方都是不可见的,所以允许我们在这个函数外的其他地方或者是其他的函数内部定义同名的变量,他们之间不会发生冲突的。因为他们都有自己的区域性,而且它没有链接性(即:不允许其他的文件访问他的)。
void function(void)
{
auto int a; //定义一个整数型自动变量 a未赋初值则当程序执行到此函数时先为a分配堆栈存储空间局部变量不赋初值时系统随机分配当时存 //储空间当时的值全局变量和局部静态变量的话赋初值为0
auto int b=1;//此处只比上一句多了一个赋初值,
int c; //这里的auto省略标准c里省略关键字当成auto处理此处未赋初值
int d=1; //
}//当退出此函数后自动变量存储空间被收回,同时在此函数外不可用且在其他函数内可以定义同名变量,自动变量作用域仅在函数内部
2.static 声明静态变量
3.register 声明寄存器变量
寄存器变量的定义形式是:
register 类型标识符 变量名
寄存器是与机器硬件密切相关的,不同类型的计算机,寄存器的数目是不一样的,通常为2到3个,对于在一个函数中说明的多于 2到3个的寄存器变量,C编译程序会自动地将寄存器变量变为自动变量。由于受硬件寄存器长度的限制,所以寄存器变量只能是 char、int或指针型。寄存器说明符只能用于说明函数中的变量和函数中的形参,因此不允许将外部变量或静态变量register
/* 程序1 */
main ( )
{
register int temp, i;
for ( i=0; i<=30000; i++ )
for ( temp=0; temp<=100; temp++ ) ;
printf ("ok\n");
}
/* 程序2 */
#include <stdio.h>
main( )
{
int temp, i;
for ( i=0; i<=30000; i++ )
for ( temp=0; temp<=100; temp++ ) ;
printf ("ok\n");
}
这种变量一般执行速度快,因为直接从硬件寄存器取数据这两个程序中,前者使用了两个寄存器变量,后者使用了两个自动变量程序除此之外完全一样。但运行时感觉的执行速度是不同的,前者使用寄存器变量的程序要比后者使用自动变量的程序要快。(如果在Tubro C的环境下运行程序2,则应该将编译器优化选项"use register variable"开关关上(OFF),否则,编译器自动优化程序使用寄存器,两个程序会得到相同的结果。)由于register变量使用的是硬件CPU中的寄存器,寄存器变量无地址,所以不能使用取地址运算符"&"求寄存器变量的地址。以上register一段来自网络。
4.extern 声明变量是在其他文件中声明
*************************************这里对四种变量声明做一下自己的总结详细参照如下链接*********************************************
1.按照作用域分可分成:局部变量,全局变量。按照生命周期分可分成:静态变量,动态变量。按照存储位置分则可存储于堆,栈,程序存储器,数据存储器,寄存器。
局部变量:则是auto关键字声明的或者省略关键字作用域仅限函数内,存储于栈,退出函数变量内存释放,同时可以在此函数外定义相同变量名不会出错。
局部静态变量:则是由static关键字声明的变量,作用域仅限函数内但是全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,退出函数时数值保留成最新更新的值整个程序运行周期都存在。未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
全局变量:全局变量定义于函数之上,可以被定义处以下所有函数调用(即同文件),存储同静态变量,若在其他文件中使用则需要加extern则说明此处使用的时全局变量且在其它文件已经声明。同时对于静态变量和全局变量未初始化时系统默认赋值为0而局部变量不赋初始值则由分配内存时当时随机值决定。
全局静态变量:此变量与全局变量的唯一不同是在本文件外不可见,即在其他文件不能通过extern声明此全局变量。
参考资料相关连接如下
存储类型auto,static,extern,register的区别
点击打开链接
变量的生命周期与作用域
(转)C语言中auto,register,static,const,volatile的区别
以上都是本人理解,如有异议欢迎讨论,纠错。