C和指针 1.1 快速上手
本文简要谈下阅读过程的理解重点。
1.1.1 注释
注释是以/*开始,以符号*/ 结束的。有时会遇到想要试图将一段暂时无用代码注释掉,如果这段代码本身还有使用的可能或者原先有注释存在,那么这样做只会增加读代码的难度。要从逻辑上删除一段C代码,更好的办法是使用#if指令。
1.1.2 预处理命令
首先,需要理解代码到可执行文件的过程:预处理(也叫预编译)、编译、汇编、链接。如下图所示的5行代码都被称为 预处理指令,因为他们是由预处理器 解释的。预编译发生在编译之前,因此编译时机器只会编译预处理命令以外的代码。
如图中所示,前3行的预处理过程为:将<>所包含的头文件内容替换掉前三行include语句。
而后2行是另一种预处理指令,它把名称MAX_COILS定义为20,把名称MAX_INPUT定义为1000。这些名称一般是大写字母,用于提醒它们并非普通的变量。这样,可以在代码中的任何需要用改数值的位置使用对应的名称,也可以相应的方便修改对应名称的数值范围。
1.1.3 函数
这里有几个内容需要重点理解:
(1)在C语言中,数组参数是以引用形式传递的,称为“传址调用”;而标量和常量则是按值传递的,在函数中对标量参数的任何修改都会在函数返回时丢失,因此调用函数无法修改被调用函数的标量参数。而当被调用函数修改数组参数的其中一个元素时,调用函数所传递的数组就会被实际地修改。
(2)字符串是一串以NUL字节结尾的字符,但是NUL本身并不是字符串的一部分,是一个字符串终止符,它的字节模式为全0。如果想要使用它而不是字符常量‘\0’必须自行定义。
(3)scanf函数所有的标量参数前面必须加上一个“&”符号,但是数组参数不需要加上“&”符号,而数组参数带下标引用的话指的是数组的某个特定元素就必须在前面加上“&”符号。
(4)scanf函数每次调用的时候都是从标准输入读取一个十进制整数。
其转换失败可能有两种原因:
a 文件已经读完,文件结尾的特殊字符无法转换为整数;
b 下一个要读取的内容无法转换为整数。