《C和指针》学习笔记(三)第十一章~第十五章

一、对每一个从malloc返回的指针进行检查是否为NULL是颇有必要的 二、使用realloc后就不能使用原来的指向旧内存的指针 三、传递给free的指针必须是从malloc\realloc\calloc返回的指针 四、不能释放一部分的内存,不要访问被free掉的内存 五、strdup()函数是c语言中经常使用的一种字符串拷贝库函数  extern char *strdup(char *s);     strdup()在内部调用了malloc()为变量分配内存,不须要使用返回的字符串时,须要用free()释放相应的内存空间,不然会形成内存泄漏。 五、只有当确实须要的时候再使用多层间接访问,不然程序会变大庞大、缓慢、难于维护 六、函数指针在使用前必须初始化指向某个函数         =&f   (&符号是能够不写的) 七、函数指针能够用在回调函数以及转换表 八、要注意转换表的越界下标引用 九、mian函数有俩个形参:argc表示命令行参数的数目,argv指向一组参数值     第一个参数值就是程序名 十、“xyz”+1      *"xyz"     "xyz"[2] 十一、把二进制转换为字符 putchar("0123456789ABCDEF"[value%16]) 十二、define定义中的stuff若是很长,末尾加反斜杠能够换行 1三、#define DEBUG_PRINT  printf("File %s line %d:"__FILE__,__LINE__)     调试语句打印编译的源文件名和行号 1四、##把位于它俩边的符号连接成一个符号 1五、宏的屡次调用可能会带来反作用,尤为是宏中有单次执行会改变状态的函数和操做时,如:++,--,getchar() 1六、#undef 移除一个宏定义 1七、#if #elif #else   用于条件编译 1八、<>函数库文件包含    “”本地文件包含 1九、#error指令容许你生成错误信息 20、#progma容许编译器提供不标准的处理过程,好比向一个函数插入内联的汇编代码 2一、在定义宏的时候不要在末尾加分号,这样会在使用时更加舒服 2二、perror()<errno.h>用于报告错误,参数是一个不是NULL的非空的字符串,打印格式:字符串: 错误     咱们不能用errno判断是否有错误发生,只有调用的函数有错误时errno的值才有意义 2三、exit()终止一个程序的执行,EXIT_SUCCESS和EXIT_FAILURE 提示程序终止是成功仍是失败 2四、fflush(stdout) 在调试用的printf后加一句 迫使一个输出流的缓冲区内的数据进行物理写入 2五、流分为俩种类型,文本(text)和二进制(binary)流流分为俩种类型,文本(text)和二进制(binary)流 2六、数据结构FILE用于访问一个流 2七、三个标准流:stdin,stdout,stderr 2八、对于输出流,fclose函数在文件关闭时刷新缓冲区,若是成功返回零值,不然返回EOF 2九、fgetc、getc、getchar函数的返回值为int型的缘由:为了容许函数报告文件的末尾,若是函数的返回值为char那么,256个字符中一定有一个字符被EOF代替,用int做为返回值可使得全部的字符都能被读取 30、fgetc和fputc是真正的函数,但getc\putc\getchar\putchar都是经过#define指令定义的宏  它们的速率差异微乎其微 3一、ungetc把先前读入的字符返回到流中,这样它能够在之后被从新读入 3二、未格式化的IO简单读取或写入字符串     格式化的IO则执行数字和其余变量的内部和外部表示形式之间的转换 3三、scanf格式代码:(1)一个可选的星号(2)一个可选的宽度(3)一个可选的限定符(4)格式代码 3四、星号将使转换后的值被丢弃而不是进行存储 3五、printf格式代码:(1)零或多个标志字符(2)一个可选的最小字段快读(3)一个可选的精度(4)一个可选的修改符(5)转换类型 3六、把数据写到文件效率最高的方法是用二进制形式写入,只有当数据被另外一个程序按顺序读取时才有用 3七、ftell函数返回流的当前位置 3八、fseek函数容许在流中定位 3九、rewind函数将读写指针设置会指定流的起始位置 40、fgetpos函数在一个fpos_t类型变量的位置存储文件的当前位置 4一、fsetpos函数把文件位置设置为一个fpos_t类型变量的值 4二、setvbuf函数将一个数组设置为流的缓冲区,注意缓冲区长度最好为BUFSIZ 4三、FILE *tmpfile(void) 用于建立一个临时文件