完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1.C语言中变量的属性
C语言中的变量可以有自己的属性 在定义变量的时候可以加上“属性”关键字 “属性”关键字指明变量的特有意义 A.语法: property type var_name; B.示例: int main() { auto int i = 0; static int k = 0; register int j = 0; extern double m; } 2.auto关键字 auto 即C语言中局部变量的默认属性 auto表明被修饰的变量存储在栈上 编译器默认所有的局部变量都是auto的 3.register关键字 register 关键字指明将局部变量存储于寄存器中 register只是请求寄存器变量,但不一定请求成功 register变量的必须是CPU寄存器可以接受的值 不能用&运算符获取register变量的地址 示例: //全局变量的生命周期是从程序运行到关闭结束,所以register不能生命static 和全局的变量 //static register int g_v; int main() { int i_var = 0;//局部变量,在栈上分配内存 static int svar = 0;//静态局部变量,在静态数据区分配内存,作用域main函数内 register char var = 0; //不能用&获取register修饰的变量,该变量存储在CPU寄存器中,不能获取地址 printf("%#x",&var);//错误 return 0; } register关键字是由于C语言早期是从B语言发展过来,为了效率兼顾,所以。。。 4.static 关键字 static 关键字指明变量的“静态”属性 A.static 修饰的局部变量存储在程序的静态区 static 关键字同时具有“作用域限定符”的意义 A.static修饰的全局变量作用域只是声明的文件中 B.static修饰的函数作用域只是声明的文件中 示例: int g_v;//全局变量 程序的任意地方均能访问,在静态数据区分配内存 static int g_vs;//静态全局变量,只有当前文件中可以访问,静态数据区分配内存 int main() { int i_var = 0;//局部变量,在栈上分配内存 static int svar = 0;//静态局部变量,在静态数据区分配内存,作用域main函数内 return 0; } 5.auto,register,static关键字示例程序 int f1() { int r = 0; r++; return r; } int f2() { //程序运行中,只初始化一次,一直存储在全局静态区 static int r = 0; r++; return r; } int main() { auto int i = 0; static int k = 0; register int j = 0; printf("%pn", &i); printf("%pn", &k); for (i = 0; i < 5; i++) { printf("%dn", f1()); } for (i = 0; i < 5; i++) { //f2中声明的静态的局部变量,会进行累加 printf("%dn", f2()); } return 0; } 6.extern 关键字 extern 用于声明“外部”定义的变量和函数 A.extern 变量子在文件的其它地方分配内存控件 B.extern 函数在文件的其它地方定义 C.示例 test.c文件中代码: int g_i=5; static int g_is = 5; int getI() { return g_is; } main.c文件中的代码: //声明访问外部定义的g_i变量 extern int g_i; //声明访问外部定义的g_is变量 extern int g_is; //声明访问外部定定义的getI函数 extern int getI(); int main() { printf("f(1,2)=%dn", f(1,2)); printf("%dn", g_i); //不能找到外部定义的g_is变量,因为外部声明了static //printf("%dn", g_is); printf("%dn", getI()); getchar(); return 0; } 小结论:从某种意义上来说,static 和 extern 是互斥的 extern 用于“告诉”编译器用C方式编译 注意:C++编译器和一些变种的C编译器默认会按“自己”的方式编译函数和变量,通过extern关键字可以命令编译器以“标准C”方式进行编译。 A.示例1:.C文件中 ,将函数f 以“标准C”方式进行编译 //定义函数以C表示运行 #ifdef __cplusplus extern "C" { #endif int f(int a, int b) { return a + b; } #ifdef __cplusplus } #endif B.示例2:.CPP文件中声明以“标准C”方式进行编译 //C++中定义函数以C表示运行 extern "C" { int f(int a, int b) { return a + b; } } 7.小结 auto 变量存储在程序的栈中,默认属性 static 变量存储在程序静态区 register 变量请求存储于CPU寄存器中 extern 表示变量或函数在其它文件中分配空间和声明 extern 能够指示编译器按照标准C方式编译程序 |
|
相关推荐
3 个讨论
|
|
只有小组成员才能发言,加入小组>>
3048 浏览 3 评论
1521 浏览 3 评论
4661 浏览 1 评论
2014 浏览 1 评论
3265 浏览 2 评论
514浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 07:49 , Processed in 1.276289 second(s), Total 70, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号