C关键字解读——volatile, extern, struct, union, enum
一、最易变的关键字 volatile
volatile 关键字和 const 一样是一种类型的修饰符。
用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统、硬件或者其它线程等。
int i = 10;
int j = i; //(1)
int k = i; //(2)
在(1)、(2)两条语句中,i 没有被用作左值。这时候,编译器认为 i 的值没有发生改变,所以在(1)语句时从内存中取出i 的值赋给 j 之后,这个值并没有丢掉,而是在(2)语句时继续用这个值给 k 赋值。提高了效率。
volatile int i = 10;
int j = i; //(1)
int k = i; //(2)
volatile 关键字告诉编译器 i 是随时可能发生变化的,每次使用它的时候必须从内存中取出 i 的值,因而编译器生成的汇编代码会重新从 i 的地址处读取数据放在 k 中。
const 和 volatile 是一对矛盾体。
二、最会带帽子的关键字 extern
extern 可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中。提示编译器在遇到此变量和函数时在其他模块中寻找其定义。
三、struct 关键字
1、空间到底多大
结构体所占的内存大小是其成员所占内存之和。
struct student{
}stu;
sizeof(stu) 的值会是?
答案是1。
2、struct 和 class 的区别
struct 的成员默认情况下都是 public 的,而 class 成员却是 private 的。
四、union关键字
union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每个数据成员配置空间。
在 union 中所有的数据成员共用一个空间,同一时间只能存储其中一个数据成员。所以所有的数据成员具有相同的起始地址。
union StateMachine
{
char character;
int number;
char *str;
double exp;
};
一个 union 只配置一个足够大的空间来容纳最大长度的数据成员。上例,StateMachine 的空间大小就是 double 数据类型的大小。
在C++里,union 的成员默认属性页为 public 。
1、大小端模式对union 类型数据的影响
union
{
int i;
char a[2];
}*p, u;
p = &u;
u.a[0] = 0x39;
u.a[1] = 0x38;
p.i 的值应该为多少?
大端模式:字数据的高字节存储在低地址中,而字数据的低字节存储在高地址中。
小端模式:字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。
如果计算机为小端模式,那么最后的结果是:14393
2、如何确认当前系统的存储模式?
写一个C函数,若处理器是Big_endian 的,返回0;若处理器是Littel_endian 的,返回1;
参考答案:
int checkSystem()
{
union check{
int i;
char ch;
}ch;
c.i = 1;
return (c.ch == 1);
}
五、enum 关键字(枚举)
一般的定义方式如下:
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 类型是对一个变量取值范围的限定,而花括号内是它的取值范围。
ENUM_CONST_1…ENUM_CONST_n,这些成员都是常量,也就是枚举常量。
enum Color
{
GREEN = 1;
RED,
BLUE,
GREEN_RED = 10,
GREEN_BLUE
}ColorVal;
其中各常量名代表的数值分别为:1,2,3,10,11
1、枚举与#define 的区别
(1)#define 宏常量是在预编译阶段进行简单替换,枚举常量则是在编译的时候确定其值
(2)一般在编译器里,可以调试枚举常量,但是不能调试宏常量
(3)枚举可以一次定义大量相关的常量,而#define 宏一次只能定义一个
https://blog.csdn.net/LiuQing_9125/article/details/7790901