C语言查漏补缺——关键字篇
Register关键字
Register 声明寄存器变量【尽可能将变量存在CPU内部寄存器,不是绝对哦】
CPU读取数据:内存——寄存器——CPU
虽然寄存器的速度非常快,但也有限制:register变量必须是能被CPU寄存器接受的类型,意味着register变量必须是一个单个的值,并且其长度应小于或等于整型的长度。而且register变量可能不存放在内存中,所以不能用取址运算符&来获取register变量的地址。
Volatile 说明变量在程序执行中可被隐含的改变
Sizeof 计算对象所占内存空间的大小,这个是关键字(⊙o⊙)哦~
[cpp]
int i = 0;
A)sizeof(i) B)sizeof(int) C)sizeof i D)sizeof int
int i = 0;
A)sizeof(i) B)sizeof(int) C)sizeof i D)sizeof int上面,ABC都是对的,D不对。
【注意】sizeof在计算变量所占空间大小时,括号可以省略;而计算类型大小时,不能省略。
看看下面的练习:
注意,sizeof(a)的值,我们再看:
【总结】Sizeof计算大小时,其实传入的是类型,与变量具体的值无关。&a、&a[0]、&a[0][0]都是地址,所以大小都为4;a的类型是char[10][10],所以是100,同理,a[0]、a[1][1]的类型分别是char[10]和char,所以大小分别是10和1。
此处传入的是指针char*,所以大小是4.若b为int[100],则传递的是int *。
【总结】函数参数为数组时,传递的不是整个数组,而是数组地址,即指针。
Sizeof与strlen的区别:
再来一个更劲爆的:
Sizeof计算结构体大小:
成员对齐规则是:每个成员按其类型的对齐参数(通常是这个类型的大小)和指定的对齐参数中较小的一个对齐,即min(sizeof(item), n)。并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节。
s1的大小为3,而s2的大小为5,说明s1的最大对齐参数是1,即s1的数据成员的最大对齐参数,而不是将s1的大小作为一个对齐参数。
Unsigned关键字
看一个例子:
Const关键字 == readonly
Const修饰的只读变量必须在定义的同时初始化。
注意,case语句后面不可以是const变量。
Const与define
Const修饰变量和数组时,可以放在类型的前面和后面:
修饰指针的时候:
Const修饰函数的参数,不希望参数值在函数体内意外改变。
Typedef关键字
Typedef与define的区别:
Define是宏定义,在预编译的时候起作用,只是做简单的替换;
Typedef是为类型新建一个别名,在编译的时候起作用。
#define int32 static int
Define是用第一个字符串int32替换第二个空格后面的所有内容。
Typedef static int int32;
编译报错,多个类型声明。
Volatile关键字
Volatile告诉编译器,变量是随时可能发生变化的,每次使用它的时候必须从内存中取出i的值。
const volatile int i = 3; 是只读变量。
Union关键字
[plain]
//返回1表示是小端模式;返回0,表示是大端模式
int checkSystem()
{
union check
{
int i;
char ch;
} c;
c.i = 1;
return(c.ch == 1);
}
//返回1表示是小端模式;返回0,表示是大端模式
int checkSystem()
{
union check
{
int i;
char ch;
} c;
c.i = 1;
return(c.ch == 1);
}
static关键字
修饰变量
静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使用extern声明也没法使用它。准确的说是从定义之处开始,到文件结尾处结束,在定义之处前面的代码也不能使用。
静态局部变量在函数体内定义,只能在函数内使用,但生命周期与文件相同。
【注意】静态变量只在定义时初始化一次。如下代码:
每次调用f1时,i的值都会递增,不会再重新定义;每次调用f2时,j的值都会被重新复制,所以,j只递增一次。
修饰函数
静态函数的作用域仅限于本文件(又称内部函数)。
综上,关键字static有俩含义:退出一个块后仍然存在的局部变量;不能被其他文件访问的全局变量和函数。
静态变量的内存分配在堆栈,因为它们的大小在编译的时候就是确定的。
补充:软件开发 , C语言 ,