第一章是对于基础知识的大致总结,通过一段典型的代码,逐句分析,让读者回忆起C语言的一些函数以及语法知识。
先来看章节开头给出的完整的代码:
在最开头的5行是预处理指令,由预处理器读入源代码,再根据预处理指令对其进行修改,再把修改过的源代码交给编译器。
在while循环中出现了gets()函数,
gets函数从标准输入读取一行文本并把它储存于作为参数传递给它的数组中,一行输入由一串字符组成,以一个换行符结尾,gets函数丢弃换行符,并在该行的末尾存储一个\0
当gets函数返回一个非NULL值,表示已被成功读取,当gets函数被调用但事实上不存在输入行时,它就返回NULL值,表达它到达了输入的末尾。
这里也涉及了字符串常量,复习一下字符串常量就是源程序中被双引号括起来的一串字符,例如:“hello”
这串字符在内存中占据6个字节的空间,按顺序分别是H,e,l,l,o和NULL。
最后,循环结束,main函数返回值是EXIT_SUCCESS
,该值向操作系统提示程序成功执行
接下来是read_column_numbers
函数的声明,该函数有两个形式参数,在函数声明的数组参数中,我们发现没有指定数组的长度,这种格式是没问题的,因为无论调用函数的程序传递给它的数组参数的长度是多少,这个函数都将照收不误。
接下来是又是一个while循环在这里终于看到了scanf函数,scanf函数的返回值是函数成功转换并储存于参数中的值的个数
scanf函数的实现原理
所有标量参数的前面必须加上一个&符号,然后在适用所有格式码时(除%c之外),输入值前的空白会被跳过,值后面的空白表示该值的结束,因此,在用%s格式码输入字符串时,中间不能包含空白
我们以简单的表达式为例
scanf("%d",&column[num])
%d表示读取一个整型值,字符从标准输入读取,前导空白被跳过,然后数字被转换为一个整数,结果存于指定的数组元素中,在参数前面,我们需要加上一个&符号,因为数组下标选择的是一个单一的数组元素,它是一个标量。
然后就到了又一个循环部分
在这里看到了getchar()读取器字符,这里经常会有一个问题,为什么ch被声明为整型,而我们却用它来读取字符?
答案是:EOF是一个整型值,它的位数比字符类型要多,把ch声明为整型可以防止从输入读取的字符意外被解释为EOF
这里出现了rearrange函数,在他的函数参数中有两个指针用于接收地址,由于它的传址调用语义,如果函数修改了形参数组的元素,它实际上将修改实参数组的对应元素,因此,例子程序把column声明为const就可以使这个参数不能被修改,
到这里第一章中的重点知识的整理就结束了