【C进阶】5、变量属性
Summary
1)auto是C语言中局部变量
的默认属性
;auto表明将被修饰的变量存储于栈上
(局部变量的存储位置)
2)register将声明的局部变量
存储于寄存器
中;register是一种请求,不一定成功;不能用取地址符&去取register变量的地址
3)static关键字主要体现两个方面
的意义:
- 指明变量的
静态
属性(生命期
、存储位置
:静态局变
存储区从栈上变到全局数据区) - 限定变量的
作用域
(静态全局变量、静态函数
:作用域只在当前文件中,本来是程序作用域)
两个方面
的用途:- extern
告诉编译器
,我声明的变量和函数
都存在的,在其他地方定义了
,你只管放心用。(定义
指的是:给变量分配内存空间,给函数确定的函数体) extern "C" { // Demo here }
:命令编译器
,用C的方式编译
。常见用法:C++需要用到C的库,都是二进制sdk,源码是不可能改的。如果用C++的方式编不过,就用下面方式使用
extern "C" { #include "xx.h"// C库的头文件 }
- C语言中的变量可以有自己的属性
- 在定义变量的时候可以加上
属性
关键字 - “属性”关键字指明变量的
特有意义
- 语法:
property
type var_name;
auto char i; register int j; static long k; extern double m;
- 语法:
- auto是C语言中
局部变量
的默认属性
; - auto表明将被修饰的变量
存储于栈上
; - 编译器默认所有的局部变量都是auto的;
void f() { int i; // 局部变量默认属性是auto auto int j; // 显示声明属性为auto }
- register关键字指明将
局部变量
存储于寄存器
中; - register只是
请求
寄存器变量,但不一定
请求成功; - register变量的值必须是CPU寄存器可以接受的值;
- 不能用
&
运算符获取register变量的地址;
register int g_v; // errorint main() { register char var; printf("%08x", &var); // error }
答:因为
寄存器的访问速度比内存的速度要快的多
,所以在C语言中为了高效,把一些需要访问高效的变量存储为寄存器变量。全局变量的生命期是程序生命期
,如果存储为register变量,就会一直占用该寄存器,这是不允许的。因为
CPU的寄存器是有限的
,因此register只是一种请求,不一定成功。问题2:为什么不能取寄存器的地址?
答:因为取地址符
&只能用来取内存的地址
。3、static
- static关键字指明变量的
“静态”
属性
- static修饰的局部变量存储在程序
静态区
- static修饰的局部变量存储在程序
- static关键字同时具有
“作用域限定符”
的意义
- static修饰的全局变量作用域只是声明的文件中
- static修饰的函数作用域只是声明的文件中
int g_v;
// 全局变量,程序的任意地方都可以访问
static int g_vs;
// 静态全局变量,只能在当前文件中访问(作用域只是当前文件)
int main()
{
int var;
// 局部变量,在栈上分配空间
static int svar;
// 静态局部变量,全局数据区分配空间
}
4、 extern
- extern用于
声明“外部”定义
的变量和函数
- extern变量在文件的其他地方
分配空间
(在其他地方定义
的) - extern函数在文件的
其他地方定义
(函数体
)
- extern变量在文件的其他地方
- extern用于“告诉”编译器用C方式编译
C++编译器或者其他一些变种C编译器会默认按自己的
方式来编译函数和变量,通过extern "C"
可以命令编译器“以标准C方式进行编译”
。
extern "C" { int f(int a, int b) { return a + b; } }
如有错漏之处,恳请指正。
推荐阅读
- 宽容谁
- 我要做大厨
- 增长黑客的海盗法则
- 画画吗()
- 2019-02-13——今天谈梦想()
- 远去的风筝
- 三十年后的广场舞大爷
- 叙述作文
- 20190302|20190302 复盘翻盘
- 学无止境,人生还很长