[C语言] C语言的基本认识(二)

learn for c

Posted by wulameng on 2018-02-11

现在距离过年还有4天,正好项目顺利发版,工作也清闲了些,想想已经一个多月没有写了,心中隐隐作痛,那我就继续出发了。


书接上回。

volatile关键字

​ volatile关键字和 const 一样是一种类型修饰符,用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。也就可以这样理解,被volatile修饰的变量,每次访问都要从内存当中读取,提高程序的稳定性。

struct关键字

​ 在不考虑内存对齐的情况下,struct变量的所占的内存大小就是他所有自变量占用内存大小的和。柔性数组是定义在结构体中的一个可变大小的数组,他的前面必须要有一个成员变量,sizeof一个有柔性数组的结构体,他的大小并不包含这个柔性数组,包括柔性数组的结构体可以用malloc()函数来进行内存的动态分配。并且用free()函数来释放内存。结构体的成员变量都是public的而class都是private。

union关键字

​ union的大小是其最大的成员变量的大小,常用union来压缩空间,使用条件是他的成员变量不可能同时使用。另外,这里我们在提一下大小端模式:

大端模式(Big_endian):字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。

小端模式(Little_endian):字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。

enum关键字

​ enum的一般定义规则如下:

1
2
3
4
5
6
7
enum enum_type_name
{
ENUM_CONST_1,
ENUM_CONST_2,
...
ENUM_CONST_n
} enum_variable_name;

​ 在这里enum_type_name是数据类型名,而enum_variable_name是enum_type_name类型的变量名,也就是枚举变量。实际上enum_type_name类型是对一个变量取值范围的限定,而花括号内则是它的取值范围(都是常量,后面的比前面的+1)。如果如果给该类型变量所赋的值不在这个范围当中,就会报错。

枚举和#define宏的区别

1)#define 宏常量是在预编译阶段进行简单替换。枚举常量则是在编译的时候确定其值。
2)一般在编译器里,可以调试枚举常量,但是不能调试宏常量。
3)枚举可以一次定义大量相关的常量,而#define 宏一次只能定义一个。

typedef 关键字

​ typedef 的真正意思是给一个已经存在的数据类型(注意:是类型不是变量)取一个别名,而非定义一个新的数据类型。在实际项目中,为了方便,可能很多数据类型(尤其是结构体之类的自定义数据类型)需要我们重新取一个适用实际情况的别名。这时候 typedef 就可以帮助我们。例如:

1
2
3
4
5
6
typedef struct student
{

//code

}Stu_st,*Stu_pst;