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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值