简单记录C语言32关键字中的存储种类关键字
前言
重新对C语言的基础知识32个关键字进行一个简单记录。
一、局部变量和全局变量
局部变量:包含在代码块中的变量叫做局部变量。局部变量具有临时性。进入代码块,自动形成局部变量,退出代码块自动 释放。
全局变量:在所有函数外定义的变量,叫做全局变量。全局变量具有全局性。
代码块:用{ }括起来的区域,就叫做代码块
变量的作用域
作用域:指的是该变量的可以被正常访问的代码区域,也就是变量的有效区域
局部变量:只在本代码块内有效
全局变量:整个程序运行期间,都有效
变量的生命周期
生命周期:指的是该变量从定义到被释放的时间范围,所谓的释放,指的是曾经开辟的空间”被释放“
局部变量: 进入代码块,形成局部变量[开辟空间],退出代码块,"释放"局部变量
全局变量: 定义完成之后,程序运行的整个生命周期内,该变量一直都有效
作用域和生命周期的区别
作用域更多的是指变量有效区域,也就是变量在哪里可以被访问到,而生命周期是一个时间概念,是指变量什么时候开辟和释放。
虽然这两个概念和代码块都有很大的关系,但这两个是完全不同的概念。
复合语句的变量只在复合语句中有效
二、32个关键字的简介
32个关键字:
词义解释:
auto :声明自动变量
break:跳出当前循环
case:开关语句分支
char :声明字符型变量或函数返回值类型
const :声明只读变量
continue:结束当前循环,开始下一轮循环
default:选择switch语句中的“其它”分支
do :循环语句的循环体
double :声明双精度浮点型变量或函数返回值类型
else :条件语句否定分支(与 if 连用)
enum :声明枚举类型
extern:声明变量或函数是在其它文件或本文件的其他位置定义
float:声明浮点型变量或函数返回值类型
for:一种循环语句
goto:无条件跳转语句
if:条件语句
int: 声明整型变量或函数
long :声明长整型变量或函数返回值类型
register:声明寄存器变量
return :子程序返回语句(可以带参数,也可不带参数)
short :声明短整型变量或函数
signed:声明有符号类型变量或函数
sizeof:计算数据类型或变量长度(即所占字节数)
static :声明静态变量
struct:声明结构体类型
switch :用于选择语句
typedef:用以给数据类型取别名
unsigned:声明无符号类型变量或函数
union:声明共用体类型
void :声明函数无返回值或无参数,声明无类型指针
volatile:说明变量在程序执行中可被隐含地改变while :循环语句的循环条件
三、存储种类关键字
auto: auto存储类是所有局部变量默认的存储类型
描述:这个这个关键字用于声明变量的生存期为自动分配栈区,在函数中定义的变量视为局部变量。auto关键字在我们写的代码里几乎看不到,它默认是省略的。
示例:
const:const是constant的简写,用来定义常量,它限定一个变量不允许被改变,产生静态作用。
注:既然这个量不能被改变,那么为什么不用宏定义?
与define进行比较:
- define是预编译指令,定义的宏是在预处理阶段展开的,而const是普通变量的定义,是只读变量,且是在编译运行阶段使用的。
- define定义的是常量,define定义的宏在编译后消失了,它不占用内存,而const定义的常变量本质上仍然是一个变量,具有变量的基本属性,有类型、占用存储单元,除了不能作为数组的长度,用const定义的常变量具有宏的优点,而且使用更方便。
- define定义的对象没有数据类型,编译器只能机械地进行字符替换,没有类型安全检查,即会出现“边际问题”或者是“括号问题”。而const定义的是变量,有数据类型。
const一般用于修饰全局变量:
全局变量的作用域是整个文件,且全局变量的生存周期为程序运行的整个过程,所以我们应该尽量避免使用全局变量,一旦某个函数改变了全局变量的值,会影响到其他引用这个变量的函数,是一个很隐蔽的操作。
如果一定要用全局变量,应该尽量的使用const进行修饰,防止不必要的人为修改,使用 const 修饰过的局部变量就有了静态特性,它的生存周期也是程序运行的整个过程,虽然有了静态特性,但并不是说它变成了静态变量。
extern:利用关键字extern,可以在一个文件中引用另一个文件中定义的变量或者函数,也可以引用同一个文件中的变量。
- 同一个文件中引用
这里int a;在main函数下面定义的,如果不用extern int a;进行外部声明,那么main函数中调用的a就会出错,使用外部声明后就能成功执行。
- 不同文件中引用
注:局部变量的优先级比全局变量的优先级高,把局部的值赋值给它
示例如下:
static:static静态变量,语言无关的通用定义:与程序有着相同生命周期的变量;
- 改变变量的生命周期,局部变量的生命周期是函数结束,静态局部变量的生命周期是整个工程结束
示例如下:
register:register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。
示例如下:
2、但是使用register修饰符有几点限制
(1)register变量必须是能被CPU所接受的类型。
这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。不过,有些机器的寄存器也能存放浮点数。
(2)因为register变量可能不存放在内存中,所以不能用“&”来获取register变量的地址。
(3)只有局部自动变量和形式参数可以作为寄存器变量,其它(如全局变量)不行。
在调用一个函数时占用一些寄存器以存放寄存器变量的值,函数调用结束后释放寄存器。此后,在调用另外一个函数时又可以利用这些寄存器来存放该函数的寄存器变量。
(4)局部静态变量不能定义为寄存器变量。不能写成:register static int a, b, c;
- 由于寄存器的数量有限(不同的cpu寄存器数目不一),不能定义任意多个寄存器变量,而且某些寄存器只能接受特定类型的数据(如指针和浮点数),因此真正起作用的register修饰符的数目和类型都依赖于运行程序的机器,而任何多余的register修饰符都将被编译程序所忽略。
总结
存储类关键字都是我们写代码的时候常用到的,简单记录不会忘记,用多了就懂了,写法还有很多,有待改进。