读K&R之指针、数组名和数组指针

The C Programming Language

数组名所代表的就是该数组最开始的一个元素的地址。其和指针是不同的,区别在于指针是一个变量,但数组名不是变量。

当把数组名传递给一个函数时,实际上传递的是该数组第一个元素的地址。在被调用函数中,该参数是一个局部变量,因此,数组名参数必须是一个指针,也就是一个存储地址值的变量。

如果p是一个指向数组中某个元素的指针,那么p+=i将对p进行加i的增量运算,使其指向指针p当前所指向的元素之后的第i个元素。对数组元素a[i]的引用也可以写成*(a+i)这种形式。

[ Read More » ]

读K&R之变量、求值顺序和副作用

The C Programming Language

对变量的命名与符号常量的命名存在一些限制条件,名字是由字母和数字组成的序列,但其第一个字符必须是字母。下划线“_”被看作是字母,通常,变量名使用小写字母,符号常量名全部使用大写字母。

对于内部名而言,至少前31个字符是有效的。函数名和外部变量名包含的字符数目可能少于31,这是因为汇编程序和加载程序可能会使用这些外部名,而语言本身是无法控制加载程序和汇编程序。对于外部名,ANSI标准仅保证前6个字符的唯一性,并且不区分大小写。

任何变量的声明都可以使用const限定符限定。该限定符指定变量的值不能被修改。对于数组而言,const限定符指定数组所有元素的值都不能被修改。

默认情况下,外部变量和静态变量都被初始化为0。未经显式初始化的自动化变量的值为未定义值(即无效值)。

[ Read More » ]

读K&R之幻数、返回值和参数传递

The C Programming Language

在程序中使用“幻数”是个坏习惯,它几乎不能提供任何信息。要避免这个问题,就是使用#define指令把符号名定义为一个特定的字符串。这使我想起来了在《深入Java虚拟机》一书中看到的一段话:

例如每个class文件必须是以四个同样的字节开始:魔数0xCAFEBABE。这个魔数的用处是让class文件分析器很容易分辨出某个文件有明显问题而加以拒绝。1

上面的“幻数”与“魔数”应该都是英文术语magic number的翻译,我把它理解成一个有特定意义的数字,这个数字没有名字,没人知道它代表什么意思,因此阅读程序代码的人就可能糊涂。——当然,0xCAFEBABE不会有人去读它,我只是想到了magic number这个词而已。

[ Read More » ]