共计 1584 个字符,预计需要花费 4 分钟才能阅读完成。
Summary
1)auto 是 C 语言中 局部变量
的默认属性
;auto 表明将被润饰的变量 存储于栈上
(局部变量的存储地位)
2)register 将申明的 局部变量
存储于 寄存器
中;register 是一种申请,不肯定胜利;不能用取地址符 & 去取 register 变量的地址
3)static 关键字次要体现 两个方面
的意义:
- 指明变量的
动态
属性(生命期
、存储地位
:动态局变
存储区从栈上变到全局数据区) - 限定变量的
作用域
(动态全局变量、动态函数
:作用域只在以后文件中,原本是程序作用域)
4)extern 关键字次要有 两个方面
的用处:
- extern
通知编译器
,我申明的变量和函数
都存在的,在其余中央定义了
,你只管释怀用。(定义
指的是:给变量分配内存空间,给函数确定的函数体) -
extern "C" {// Demo here}
:命令编译器
,用 C 的形式编译
。常见用法:C++ 须要用到 C 的库,都是二进制 sdk,源码是不可能改的。如果用 C ++ 的形式编不过,就用上面形式应用extern "C" {#include "xx.h" // C 库的头文件}
C 语言中的各种属性关键字
- C 语言中的变量能够有本人的属性
- 在定义变量的时候能够加上
属性
关键字 -
“属性”关键字指明变量的
特有意义
- 语法:
property
type var_name;
auto char i; register int j; static long k; extern double m;
- 语法:
1、auto
- auto 是 C 语言中
局部变量
的默认属性
; - auto 表明将被润饰的变量
存储于栈上
; -
编译器默认所有的局部变量都是 auto 的;
void f() { int i; // 局部变量默认属性是 auto auto int j; // 显示申明属性为 auto }
2、register
- register 关键字指明将
局部变量
存储于寄存器
中; - register 只是
申请
寄存器变量,但不肯定
申请胜利; - register 变量的值必须是 CPU 寄存器能够承受的值;
-
不能用
&
运算符获取 register 变量的地址;register int g_v; // error int main() { register char var; printf("%08x", &var); // error }
问题 1:为什么不能将全局变量存储为寄存器变量?
答:因为 寄存器的访问速度比内存的速度要快的多
,所以在 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;} }
本文总结自“狄泰软件学院”唐佐林老师《C 语言进阶课程》。
如有错漏之处,恳请斧正。