自己的思考:
1、编译器、预处理器的区别:
预处理器会处理相关的预处理指令,一般是以"#"开头的指令。如:#include "xx.h" #define等。预处理器处理程序的源代码,在编译器之前运行。关于处理器的介绍可以参照详解C/C++预处理器
编译器把对应的*.cpp翻译成*.s文件(汇编语言)。
汇编器则处理*.s生成对应的*.o文件(obj目标文件)
最后链接器把所有的*.o文件链接成一个可执行文件(?.exe)
读书笔记:
五、指针与数组
1、地址运算符&只能用于内存中的对象,即变量与数组元素。它不能作用于表达式、常量或register类型的变量。
2、指针和数组名之间有一个不同之处。指针是一个变量,因此在c中,语句pa=a和pa++都是合法的(pa是一个指针)。但是数组名不是变量,因此类似于a=pa或者a++的形式是非法的。
3、如果将二维数组作为参数传递给函数,那么在函数的参数声明中必须指明数组的列数,数组的行数没有太大关系。
4、在调用主函数main时,可以带有两个参数。argc和argv.argv是一个指向字符串数组的指针,其中每个字符串对应一个参数。argv是一个执行指针数组的指针。
六、结构
1、如果结构声明的后面不带变量表,则不需要为它分配存储空间,它仅仅描述了一个结构的模板或轮廓。
2、结构的合法操作只有几种:作为一个整体复制和赋值,通过&运算符取地址,访问其成员。
3、low和high的初值分别指向表头元素的指针和表尾元素的指针。如果要计算中间元素的位置,两个指针之间的加法是非法的(mid=(low+high)/2),但是指针的减法运算却是合法的。(mid = low +(high - low) /2 )
4、由于typedef是由编译器解释的,因此它的文本替换功能要超过预处理器的能力。
5、联合:
(1)联合提供了一种方式,以在单块存储区中管理不同类型的数据,而不需要在程序中嵌入任何同机器有关的信息:一个变量可以合法地保存多种数据类型中任何一种类型的对象。类似于面向对象中的多态。
(2)联合就是一个结构,他的所有成员相对于基地址的偏移量都为0,此结构空间要大到足够容纳最”宽“的成员,并且,其对齐方式要适合联合中所有类型的成员。
(3)联合只能用其第一个成员类型的值进行初始化。
七、输入与输出
1、scanf的参数除了第一个是format的格式说明,其他参数都必须是指针,用于指定经格式转换后相应输入保存的位置。
2、大多数操作系统都限制了一个程序可以同时打开的文件数,所以当文件不再需要时就应该释放。
八、UNIX系统接口
1、系统负责维护已打开文件的所有信息,用户程序只能通过文件描述符引用文件。
2、fopen函数的主要功能是打开文件,定位到合适的位置,设置标志位以指示相应的状态。它不分配任何缓冲区空间,缓冲区的分配实在第一次读文件时有函数_fillbuf完成的。
3、malloc并不是从一个在编译时就确定的固定大小的数组中分配存储空间,而是在需要时向操作系统申请空间。因为程序中的某些地方可能不通过malloc调用申请空间,所以malloc管理的空间不一定是连续的。
4、在malloc函数中,请求的长度将被舍入,以保证它是头部大小的整数倍。实际分配的块将多包含一个单元,用于头部本身。实际分配的块的大小将被记录在头部的size字段中。malloc函数返回的指针将指向空闲空间,而不是块的头部。