"C语言的495个常见问题" 是一本关于C语言编程中遇到的各种问题的集合,由Steve Summit原著,朱群英和孙云翻译。这本书旨在帮助读者解决C语言学习过程中的困惑,适合面试准备和技能提升。书中涵盖了声明与初始化、结构、联合和枚举等多个主题。
在声明和初始化方面:
1.1 选择整数类型时,应根据实际需求考虑存储范围,如int、short、long和long long分别对应不同的大小。
1.2 在64位系统上,64位类型的表示取决于具体平台,通常有int64_t、uint64_t等类型。
1.3 全局变量和函数最好在外部文件中声明并在需要的地方用extern引用,以减少命名冲突。
1.4 extern在函数声明中用于告知编译器该函数是在其他地方定义的。
1.5 auto关键字在现代C++中已不再常用,但在旧代码中可能作为局部变量的默认存储类别。
1.6 C语言允许结构体包含指向自身的指针,只需正确处理typedef和指针声明。
1.7 复杂声明的理解需要熟练掌握分层解析,例如理解多级指针、数组和函数返回类型。
1.8 函数不应重复声明,可能导致编译错误。
1.9 main()的正确定义通常是int main(),void main()不标准且不被推荐。
1.10 未初始化的变量值是不确定的,全局变量默认不初始化,不能假定它们为零、空指针或浮点零。
1.11 字符串字面量不能直接赋值给非静态局部数组,因为内存分配不同。
1.12 malloc返回的是未初始化的内存,需要显式初始化,不能直接赋值给指针。
1.13 a[]是数组,可以修改;p是字符串常量指针,修改会导致未定义行为。
1.14 函数指针的声明需指定返回类型和参数列表,初始化时需要匹配对应的函数地址。
在结构、联合和枚举方面:
2.1 声明struct x1{}创建了一个结构类型,而typedef struct {} x2;创建了一个别名,两者使用方式不同。
2.2 struct x{};之后应立即定义一个变量,如struct x theStruct;否则需要再次声明结构类型。
2.3 结构体可以包含指向自身的指针,实现递归结构或自引用。
2.4 实现抽象数据类型(ADT)通常通过结构体和相关的操作函数来封装数据。
2.5 C语言本身不支持面向对象特性,但可以通过模拟,如结构体和函数指针组合实现类似功能。
这本书深入浅出地探讨了C语言中的这些关键概念,并提供了实用的解决策略,对于任何想要提升C语言技能的开发者来说都是宝贵的参考资料。通过解答这些问题,读者能够更好地理解和掌握C语言的核心概念,从而编写更高效、更可靠的代码。