您的位置:首页 > 其它

C关键字解读——volatile, extern, struct, union, enum

2012-07-29 09:49 441 查看
一、最易变的关键字 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 宏一次只能定义一个。



http://blog.csdn.net/dahaii0/article/details/6924890
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: