《C语言深度解剖:解开程序员面试笔试的秘密》由作者结合自身多年嵌入式C语言开发经验和平时讲解C语言的心得体会整理而成,其中有很多作者独特的见解或看法。由于并不是从头到尾讲解C语言的基础知识,所以
《C语言深度解剖:解开程序员面试笔试的秘密》并不适用于C语言零基础的读者,其内容要比一般的C语言图书深得多、细致得多,其中有很多问题是各大公司的面试或笔试题。
《C语言深度解剖:解开程序员面试笔试的秘密》适合广大计算机系学生、初级程序员参考学习,也适合计算机系教师、中高级程序员参考使用。
目录
- 第1章 关键字
- 1.1 最宽宏大量的关键字——auto
- 1.2 最快的关键字——register
- 1.2.1 皇帝身边的小太监——寄存器
- 1.2.2 使用register修饰符的注意点
- 1.3 最名不符实的关键字——static
- 1.3.1 修饰变量
- 1.3.2 修饰函数
- 1.4 基本数据类型——short、int、long、char、float、double
- 1.4.1 数据类型与“模子”
- 1.4.2 变量的命名规则
- 1.5 最冤枉的关键字——sizeof
- 1.5.1 常年被人误认为函数
- 1.5.2 sizeof(int)*p表示什么意思
- 1.6 signed、unsigned关键字
- 1.7 if、else组合
- 1.7.1 bool变量与“零值”进行比较
- 1.7.2 float变量与“零值”进行比较
- 1.7.3 指针变量与“零值”进行比较
- 1.7.4 else到底与哪个if配对呢
- 1.7.5 if语句后面的分号
- 1.7.6 使用if语句的其他注意事项
- 1.8 switch、case组合
- 1.8.1 不要拿青龙偃月刀去削苹果
- 1.8.2 case关键字后面的值有什么要求吗
- 1.8.3 case语句的排列顺序
- 1.8.4 使用case语句的其他注意事项
- 1.9 do、while、for关键字
- 1.9.1 break与continue的区别
- 1.9.2 循环语句的注意点
- 1.10 goto关键字
- 1.11 void关键字
- 1.11.1 void a
- 1.11.2 void修饰函数返回值和参数
- 1.11.3 void指针
- 1.11.4 void不能代表一个真实的变量
- 1.12 return关键字
- 1.13 const关键字也许该被替换为readonly
- 1.13.1 const修饰的只读变量
- 1.13.2 节省空间,避免不必要的内存分配,同时提高效率
- 1.13.3 修饰一般变量
- 1.13.4 修饰数组
- 1.13.5 修饰指针
- 1.13.6 修饰函数的参数
- 1.13.7 修饰函数的返回值
- 1.14 最易变的关键字——volatile
- 1.15 最会带帽子的关键字——extern
- 1.16 struct关键字
- 1.16.1 空结构体多大
- 1.16.2 柔性数组
- 1.16.3 struct与class的区别
- 1.17 union关键字
- 1.17.1 大小端模式对union类型数据的影响
- 1.17.2 如何用程序确认当前系统的存储模式
- 1.18 enum关键字
- 1.18.1 枚举类型的使用方法
- 1.18.2 枚举与#define宏的区别
- 1.19 伟大的缝纫师——typedef关键字
- 1.19.1 关于马甲的笑话
- 1.19.2 历史的误会——也许应该是typerename
- 1.19.3 typedef与#define的区别
- 1.19.4 #define a int\[10\]与typedef int a\[10\]
- 第2章 符号
- 2.1 注释符号
- 2.1.1 几个似非而是的注释问题
- 2.1.2 y = x/*p
- 2.1.3 怎样才能写出出色的注释
- 2.2 接续符和转义符
- 2.3 单引号、双引号
- 2.4 逻辑运算符
- 2.5 位运算符
- 2.5.1 左移和右移
- 2.5.2 0x01[[2+3的值为多少
- 2.6 花括号
- 2.7 ++、--操作符
- 2.7.1 ++i+++i+++i
- 2.7.2 贪心法
- 2.8 2 /(-2)的值是多少
- 2.9 运算符的优先级
- 2.9.1 运算符的优先级表
- 2.9.2 一些容易出错的优先级问题
- 第3章 预处理
- 3.1 宏定义
- 3.1.1 数值宏常量
- 3.1.2 字符串宏常量
- 3.1.3 用define宏定义注释符号“?”
- 3.1.4 用define宏定义表达式
- 3.1.5 宏定义中的空格
- 3.1.6 #undef
- 3.2 条件编译
- 3.3 文件包含
- 3.4 #error预处理
- 3.5 #line预处理
- 3.6 #pragma预处理
- 3.6.1 #pragma message
- 3.6.2 #pragma code_seg
- 3.6.3 #pragma once
- 3.6.4 #pragma hdrstop
- 3.6.5 #pragma resource
- 3.6.6 #pragma warning
- 3.6.7 #pragma comment
- 3.6.8 #pragma pack
- 3.7“#”运算符
- 3.8“##”预算符
- 第4章 指针和数组
- 4.1 指针
- 4.1.1 指针的内存布局
- 4.1.2“*”与防盗门的钥匙
- 4.1.3 int*p=NULL和*p=NULL有什么区别
- 4.1.4 如何将数值存储到指定的内存地址
- 4.1.5 编译器的bug
- 4.1.6 如何达到手中无剑、胸中也无剑的境界
- 4.2 数组
- 4.2.1 数组的内存布局
- 4.2.2 省政府和市政府的区别——&a\[0\]和&a的区别
- 4.2.3 数组名a作为左值和右值的区别
- 4.3 指针和数组之间的恩恩怨怨
- 4.3.1 以指针的形式访问和以下标的形式访问
- 4.3.2 a和&a的区别
- 4.3.3 指针和数组的定义与声明
- 4.3.4 指针和数组的对比
- 4.4 指针数组和数组指针
- 4.4.1 指针数组和数组指针的内存布局
- 4.4.2 int (*)\[10\] p2——也许应该这么定义数组指针
- 4.4.3 再论a和&a之间的区别
- 4.4.4 地址的强制转换
- 4.5 多维数组和多级指针
- 4.5.1 二维数组
- 4.5.2 二级指针
- 4.6 数组参数和指针参数
- 4.6.1 一维数组参数
- 4.6.2 一级指针参数
- 4.6.3 二维数组参数和二级指针参数
- 4.7 函数指针
- 4.7.1 函数指针的定义
- 4.7.2 函数指针的使用
- 4.7.3 (*(void(*) ())0)()——这是什么
- 4.7.4 函数指针数组
- 4.7.5 函数指针数组指针
- 第5章 内存管理
- 5.1 什么是野指针
- 5.2 栈、堆和静态区
- 5.3 常见的内存错误及对策
- 5.3.1 指针没有指向一块合法的内存
- 5.3.2 为指针分配的内存太小
- 5.3.3 内存分配成功,但并未初始化
- 5.3.4 内存越界
- 5.3.5 内存泄漏
- 5.3.6 内存已经被释放了,但是继续通过指针来使用
- 第6章 函数
- 6.1 函数的由来与好处
- 6.2 编码风格
- 6.3 函数设计的一般原则和技巧
- 6.4 函数递归
- 6.4.1 一个简单但易出错的递归例子
- 6.4.2 不使用任何变量编写strlen函数
- 第7章 文件结构
- 7.1 文件内容的一般规则
- 7.2 文件名命名的规则
- 7.3 文件目录的规则
- 第8章 关于面试的秘密
- 8.1 外表形象
- 8.1.1 学生就是学生,穿着符合自己身份就行了
- 8.1.2 不要一身异味,熏晕考官对你没好处
- 8.1.3 女生不要带2个以上耳环,不要涂指甲
- 8.2 内在表现
- 8.2.1 谈吐要符合自己身份,切忌不懂装懂、满嘴胡咧咧
- 8.2.2 态度是一种习惯,习惯决定一切
- 8.2.3 要学会尊敬别人和懂礼貌
- 8.3 如何写一份让考官眼前一亮的简历
- 8.3.1 个人信息怎写
- 8.3.2 求职意向和个人的技能、获奖或荣誉情况怎么突出
- 8.3.3 成绩表是应届生必须要准备的
- 附录1 C语言基础测试题
- 附录2 C语言基础测试题答案
- 后记
-
参考文献