C语言中的变量可以有自己的属性;
在定义变量的时候加上“属性”关键字;
“属性”关键字指明变量的特有意义;
语法:
property type var_name
示例:
全局变量存储在静态存储区。
什么是静态存储区:
内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。
什么是栈:
在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
auto关键字
(只修饰局部变量)
auto即C语言中局部变量的默认属性;
auto表明将被修饰的变量存储于栈上;
编译器默认所有的局部变量都是auto的;
示例:
register关键字
寄存器变量的意义是请求编译器将这个变量存储与寄存器中,而不是内存中。寄存器个数是有限的,故不可能将程序中所有变量都声明为寄存器变量。所以在C语言中,register关键字只是请求,但不一定成功。
1)register关键字指明将局部变量存储与寄存器中;
2)register只是请求寄存器变量,但不一定成功;
3)register变量的必须是CPU寄存器可以接受的值;
4)不能用&运算符获取register变量的地址;
(取址运算符取的是内存的地址)
全局变量的生存周期是程序运行到程序结束,如果说全局变量占据了寄存器,代表从程序开始到结束都要占用这个寄存器,由于寄存器变量有限,长时间占用,会导致CPU无法正常工作。
那么为什么请求不一定成功?
寄存器的访问速度比内存的快得多。(C语言为了追求效率而有的)
示例:
static关键字
static关键字指明变量的“静态属性”
- static修饰的局部变量存储在程序静态区。(从栈上挪到静态数据区,生命周期和全局变量相同,只是作用域是局部的)
static关键字同时具有“作用域限定符”的意义;
- static修饰的全局变量作用域只是声明的文件中;
- static修饰的函数作用域只是声明的文件中;
示例:
var和svar作用域一样,但是生命周期不同。
1)存储在静态数据区
2)仅在第一次调用时自动初始化为0
3)第二次调用保留上次的值
4)静态局部变量生命周期为程序运行期,因为存在静态存储区
5)文件作用域标识符
实验分析:
源码:
结果:
extern关键字
1)extern用于声明“外部”定义的变量和函数:
- extern变量在文件的其他地方分配空间;
- extern函数在文件的其他地方定义;
(告诉编译器这个变量是存在的)
2)extern用于“告诉”编译器用C方式编译:
C++编译器和一些变种C编译器默认会按“自己”的方式编译函数和变量,通过extern关键字可以命令编译器“以标准C方式进行编译”。
示例:
小结:
函数和全局变量在C语言中可以跨文件引用,也就是说他们的连接范围是全局的,具有文件连接属性,总之意思就是全局变量和函数是可以跨文件看到的(直接影响就是,在a.c和b.c中各自定义了一个函数func,名字相同但是内容不同,编译报错)
定义函数都必须在外面,不能在一个函数里面定义别的函数,所以没有局部函数,只有全局函数。
void func1(void)
{
int a;
void func2()
{
int b;
}
} //编译报错