1.变量的属性:定义变量时,加上属性关键字
2.属性关键字指名变量特有意义
使用语法
#include<stdio.h> int main() { auto char i; register int j; static long k; extern double m;
return 0; } |
3.关键字的分类:
(1)Auto关键字:auto是c语言中局部变量的默认属性,存储在栈上。
示例:
#include<stdio.h> int main() { int i;//局部变量默认属性为auto auto int j;//声明auto属性 return 0; } |
(2)register关键字:将局部变量存储于寄存器中,即为寄存器变量。
1)为什么要用寄存器变量:寄存器比内存速度要快的多多多。
2)Register只是请求寄存器变量,但不一定请求成功(寄存器有限)。
3)不能用&云算法获取register变量的地址,&只能获得内存的地址,不能获得寄存器的地址
例:
#include<stdio.h> register int g_v;//错误,在intmain外,全局变量,register只可用于声明局部变量 int main() { register char var;//可以成为寄存器变量,具体要看是否有寄存器 print("0x%08X",&var); return 0; } |
(3)static关键字:指名变量的“静态”属性,将局部变量存储在程序静态区(从栈移到静态区,与全局变量的生命周期相同,但只是工作在局部)
补充:全局变量与静态变量:
#include<stdio.h> int g_v;//全局变量,(1)程序任意地方均可访问(2)存储在程序的静态区,生命周期为程序运行到结束 static int g_vs;//全局变量,设为静态,只有当前文件中可以访问
int main() { int var;//局部变量,auto关键字,在栈上分配空间 static int svar;//局部变量,从栈移到静态区,生命周期改变 return 0; } |
1)static还具有“作用域限定符”的意义(static修饰的全局变量作用域只是在声明的文件中,修饰的函数只是在声明的文件中)
2)实例分析:
#include<stdio.h> int f1() { int r=0;//r是auto的局部变量,在栈上分配空间,调用返回之后,局部变量消失 r++; return r; } int f2() { static int r=0;//唯一不同,r是static的静态局部变量,在静态区分配空间,调用返回之后,局部变量不消失 r++; r++; return r; }
int main() { auto int i=0;//声明i为auto,i为栈变量 static int k=0;//局部变量k的存储区在静态区,作用域在main register int j=0;//向编译器申请将j存储在寄存器中
printf("%p,",&i); printf("%p,",&k); printf("%p,",&j);//error,&只能返回内存的地址
for(i=0;i<5;i++)// { printf("%d,",f1()); } for(i=0;i<5;i++) { printf("%d,",f2()); } getchar();
return 0; } |
分析;(1)I和k相邻定义,但是地址相差远:一个存在栈上,一个存在静态区。若存在同一个位置,则存储在相邻位置 。
(2)输出的11111,12345差异: 第一个r是auto的局部变量,在栈上分配空间,调用返回之后,局部变量消失。第二个r是static的静态局部变量,在静态区分配空间,调用返回之后,局部变量不消失,生命周期是程序的运行周期。
(4)extern关键字
1)声明“外部”定义的变量和函数(在文件的其他地方分配空间,定义)
2)用于告诉编译器用c方式编译
extern "c" { int f(int a,int b) { return a+b; } } |
3)编程实验:static和extern使用
#include<stdio.h>
extern int g_i;//告诉程序g_i在其他位置 int main() { printf("%d\n",g_i); return 0; }
int g_i;//全局变量定义在main后,需要extern提前声明
|
分析:如果全局变量在main后定义,会报错,需要在main前声明为extern
总结:1.auto变量存储在程序的栈,为默认属性
2.static存在程序静态区,作用域限定符,作用域缩小在文件中
3.register存储在寄存器中
4.extern的变量在程序其他位置分配空间,可以指示c++程序中,以c方式编译程序。