读书笔记《c语言深度解剖》(3)

来源:互联网 发布:淘宝网手机app下载 编辑:程序博客网 时间:2024/05/16 19:09

 7.const关键字
const关键字在早时候的文章中,自己已经总结过一些。这次在这本书上看到的讲解,是完全针对c语言的,有一些之前不知道的知识,所以在这里补充一下。
const修饰的变量时只读变量,它推出的目的是取代预编译指令。注意,define并不是关键字!const的作用有很多,修饰只读变量,这个就不说了。其还有一点好处就是和define相比,能够避免不必要的内存分配,提高效率。c++编译器通常不为const只读变量分配内存,而是将他们保存在符号表之中(编译器只将基本类型的const变量放入符号表中,而非基本类型的const变量,编译器会为其分配空间)。比如:但是如果用c编译器编译运行上面这段程序,会输出两个20。因为c编译器为const变量分配了空间。于是可以通过指针修改const变量的值。 这两个例子证实了上面的道理。另外,如果const变量是全局变量,那么该变量放在文字常量区(用来存放常量,如常量字符串),一般来说是修改不了的(黄色这段话被实验证明是错误的,照样可以修改)如果const变量是局部变量,那么自然存放在栈区。这种情况下,非基本类型的const变量的意义就不大了,因为可以通过指针消除const的只读性质。
另外就是c++中是可以的,在c中是编译不过的。因为在ANSI C中,size的定义是一个只读变量。而在c++标准中,size的定义是一个常量也就是说,c编译器会为size分配内存空间;而c++编译器将size保存在了符号表中,使得他成为了一个编译期间的常量。但是c++编译器也有两种情况:声明一个外部的const变量(extern const int b)会分配内存,直接定义一个const基本类型变量,不会分配内存。

const修饰数组,和const修饰一般变量一样,可以用 两种形式。
const修饰指针只需要记住一条规则:忽略掉类型名称(如int,编译器在解析的时候也是忽略类型名称的),const离哪个近,就修饰哪个。 const修饰函数参数,表示参数在函数体内不可变。
const修饰函数返回值,表示函数的返回值不可变。
8.volatile关键字
volatile关键字保证了对特殊地址的稳定访问。比如: 在第1,2两条语句之间,i并没有被用作为左值,也就是说编译器认为i并没有被修改,在从内存中取出i值赋值给a之后,这个值并没有丢掉,而是继续赋给b。volatile关键字告诉编译器,i值是随时可能变化的,所以每次使用它的时候必须从内存中取出i的值。这样,如果i是被多个线程共享的数据,那么volatile关键字可以保证对i的正确访问。
9.extern关键字
extern关键字主要是用来声明外部变量和函数的,它提示编译器在其他编译模块中寻找这个变量或函数的定义。两个例子:

原创粉丝点击