一、要学习的书
《c缺陷和陷阱》、《c和指针》、《c专家编程》。
二、知识点学习
①字符串
1、 strlen()函数的返回值是什么类型的?
2、 字符串strlen() 的值,是否和他占据的内存空间相同?
3、 你是否知道strcpy 函数存在的潜在风险?如何避免?
4、 如果一个字符串没有字符串结束符,而调用str 开头的库函数,会发生什么?
5、 Strcpy(),strcat(),strcmp(),strncpy(),strncat(),strncmp()内部到底是如何运行的?这些函数到底对源字符串和目标字符串做了些什么?你是否观察过它们运行时两个字符串内存的变化?
6、 上面这些函数使用时,各有哪些需要注意的地方?
7、 你会几种字符串查找操作?
8、 c语言中有字符串这个数据类型吗?
9、 对字符串进行操作的时候,是否为字符串结尾符预留存储位置?不然的话容易造成非常访问内存。
②数组
1、
2、
3、
4、
5、
6、
7、
8、
③结构体
1、 你知道什么是位域结构体吗?如何定义它?如何使用它?
2、 你知道字节对齐对结构体占用内存空间大小的影响吗?如何计算结构体占用内存的大小?
④宏
1、 你知道宏的本质是什么吗?函数?语句?类型定义?或者其他?
2、 你知道语言设计者为什么设计宏吗?这些原因目前是否仍然成立?
3、 你会设计带有参数的宏吗?
4、 你知道使用宏的参数的的时候的注意事项吗?
5、 你会设计带有可变参数的宏吗?
6、 你知道使用宏有什么劣势吗?
7、 你有没有更好的替代方案?
⑤枚举
1、 是否可以指定枚举中各项的值?
2、 如果不指定值,枚举的第一个值是多少?
3、 枚举的值是否可以是负数?
4、 定义枚举的时候,你是否专门定义了枚举的最小值和最大值?
⑥switch
1、 switch(c)中的 c 的数据类型有哪些?
2、 你是否在所有的switch 中都加了 default 语句?
3、 是否在所有的case 中都加了 break 语句(一般情况的做法)?如果你不加 break ,将会发生什么?
⑦static
1、
2、
3、
4、
5、
⑧const
1、 你是否经常使用const 来表明不能够被更改的变量?
2、 你是否经常使用const 常量来代替宏?
3、 下面四种情况,你知道是各表示什么意思吗?
int
const
int
int*
const
4、 你知道const 常量如何初始化吗?
⑨sizeof
1、
2、
3、
⑩指针
1、
2、
3、
4、
5、
6、
7、
11.动态分配内存
1、
2、
3、
12.函数
1、
2、
3、
4、
5、
6、
7、
13.变量
1、
2、
3、
4、
5、
14.连接(Linux)
1、
2、
3、
4、
5、
6、
15.运行时的数据结构(Linux)
1、 你知道什么是段的概念吗?
2、 可执行程序可以分为几个段?每个段保存的是什么内容?
3、 如何查看可执行程序各个段的大小?
4、 当函数被调用时发生了什么?
5、 你有没有试过程序的栈空间最大有多大?程序超过此大小会发生什么?
6、 你使用的系统的栈是向下生长的,还是向上生长的?
16.Include
1、 如何避免对同一头文件的多次include ?
17.声明
1、 什么是 声明 ,什么是定义?
2、 你是否会运用c 语言声明的优先级规则?
18.关于 复杂度 :
1、 软件的首要技术使命 是 管理复杂度。
2、 优秀程序员的 一个特质 是将复杂的事情简单化,而非将简单的问题复杂化。所以,他们一般会选择简单的解决方案。
3、 极尽机巧,复杂的解决方案,除了将新手搞得晕头转向之外,别无他用。
4、 阅读优秀程序员的代码,是一种享受,你很少遇到思维的阻力,你可以尽情的享受简单之美。