人们总说时间会改变一些, 但实际上这一切还得你自己来.
一. 概念详解
变量: 计算机语言中储存计算结果, 其值可以被修改. 通过变量名来访问计算机中一段连续的内存空间.
属性: 区别于同类事物的特征.
C 语言中变量的属性关键字有: auto register static extern
二. 属性关键字详解
1auto
用于修饰局部变量的默认属性修饰关键字, 表明将自动变量表明存储在栈中.
@note:auto 只能修饰局部变量, 修饰全局变量会报错.
- #include <stdio.h>
- auto int var=1; //err: auto 不能修饰全局变量.
- int main(){
- printf("%d\n",var);
- return 0;
- }
2register
用于向编译器申请将局部变量放入寄存器区域, 不一定请求成功.
- #include <stdio.h>
- register int var=1; //err: register name not specified for 'var'
- int main(){
- register int i=1;
- printf("%d\n",&i); //err:address of register variable 'i' requested
- printf("%d\n",var);
- return 0;
- }
@note: 不能利用取地址运算符 &, 来获得寄存器变量的地址.
3static
将变量存储到静态区域.
修饰全局变量: 将静态全局变量的作用域缩小到定义文件.
修饰局部变量: 将静态局部变量存储到静态区域, 延长局部变量的生命周期.
修饰函数: 静态函数作用域只是声明的文件中.
- #include <stdio.h>
- int f1(){
- int i=0;
- i++;
- return i;
- }
- int f2(){
- static int i=0;
- i++;
- //k++; //err:'k' undeclared (first use in this function)
- return i;
- }
- int main(){
- int j=0;
- static int k;
- for(j=0;j<5;j++)
- printf("%d\n",f1());
- for(j=0;j<5;j++)
- printf("%d\n",f2());
- return 0;
- }
4extern
用于声明外部的变量或函数, 告知编译器在其他文件中寻找该变量或函数定义.
扩展: C 与 C++ 语言之间的桥梁, 告知 C/C++ 编译器以 C 语言编译方式编译.
- #include <stdio.h>
- extern int i; //
- int main(){
- printf("%d\n",i); // 告诉编译器 i 在其他地方可以找到.
- return 0;
- }
- int i=99;
三, extern 和 static 的互斥关系
extern 用于引用外部的, 也即其他文件中的全局变量或函数. 而 static 修饰的全局变量作用域被限定在本文件内, 故而使用 extern 关键字引用其他文件的静态全局变量是不行的.
- test1.c
- #include <stdio.h>
- extern int i;
- int main(void){
- printf("%d\n",i);
- return 0;
- }
- test2.c
- 1 #include <stdio.h> 2 static int i=99;
报错 err:undefined reference to `i'
extern 可与 static 结合使用, 屏蔽 test2 代码中的实现细节, 只提供一个函数接口给其他人使用, 可有效防止泄密.
使用示例:
- #include <stdio.h>
- extern int getI();
- extern int putI(int j);
- int main(void){
- int i;
- i=getI();
- printf("%d\n",i);
- scanf("%d",&i);
- putI(i);
- i=getI();
- printf("%d\n",i);
- return 0;
- }
- #include <stdio.h>
- static int i=99;
- int getI(){
- return i;
- }
- int putI(int j){
- i=j;
- return 0;
- }
来源: http://www.bubuko.com/infodetail-3446492.html