`
java-mans
  • 浏览: 11410421 次
文章分类
社区版块
存档分类
最新评论

C语言深度解剖(精讲版)——读书笔记6 &&自己的一些理解

 
阅读更多

第一章: 关键字

最易变的关键字----volatile

说到volatile的易变让我想起了一个星座....你猜才是什么星座?--- 双子座!偷笑双子座的人是一个多变性格出了名的;

volatile用它修饰的变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件、线程 其他等;遇到这个关键字声明的变量,编译器对访问该变量的代码不再进行优化,从而可以提供对特殊地址的稳定访问。

先看看下面的例子:

int i=10;

int j=i; //(1)语句

intk=i; //(2)语句

此时编译器对代码优化,这是因为在(1)(2)两条语句中i没有被用作左值(没有被赋值)。这时编译器认为i没有发生改变,所以在(1)语句时内存中取出i的值赋值给j之后,这个值并没有被丢掉,而是在(2)语句时继续用这个值给k赋值。编译器不会生成出汇编代码重新从内存里取出i的值,这样提高了效率。但要注意:(1)(2)语句之间确认i没有被用作左值才行。

再看一个例子:

volatile int i=10;

int j=i; //(3)

int k=i; //(4)

volatile关键字告诉编译器,i是随时可能发生变化的,每次使用它的时候必须从内存中取出i的值,因而编译器生成汇编代码会重新从i的地址处读取数据放在k中。

由上面两个例子看出,如果i是一个寄存器变量,表示一个端口数据或者是多个线程的共享数据,那么就容易出错,所以说volatile可以保证对特殊地址的稳定访问。但注意:在Visual C ++ 6.0中,一般Debug 模式没有进行代码优化,所以这个关键字的作用可能看不出来。

留个问题:

const volatile int i=10;

这行代码有没有问题??如果没有,那么i到底是什么属性?如果有,说说见解....

我觉得有问题:const 修饰的变量具有:只读不可变性 ;而volatile 修饰的变量具有:易变性;这又是可变、又是不可变的到底属于什么变呀?莫非是蔡依林的《看我72变》?

其实:说句大实话,volatile 在嵌入式里是很常见的,所以这个学嵌入式的你懂的....

神奇的-----struct 关键字

struct 它将一些相关联的数据打包成一个整体,方便使用。

在网络协议、通信控制、嵌入式系统、驱动开发等地方,我们经常需要传送的不是简单的字节流(char型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。经验不足的开发人员往往将所有需要传送的内容依顺序保存在char型数组中。通过指针偏移的方法来传送网络文报等信息。这样做变成复杂,易出错,而且一旦控制方式和通信协议有所变化,程序就要进行非常细致的修改,非常容易出错。

这个时候就需要一个结构体就能搞定。平时我们要求函数的参数尽量不多于4个,如果函数的参数多于4个使用起来就非常容易出错,这时候可以用结构体压缩参数个数。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics