C语言问题集:从基础到高级

需积分: 42 0 下载量 115 浏览量 更新于2024-07-30 收藏 1.34MB PDF 举报
"《你必须知道的495个C语言问题》是一个汇集了C语言常见问题的集合,由Steve Summit原著,朱群英和孙云翻译,版本为0.9.4,发布于2005年6月23日。这本书涵盖了从基本的声明和初始化到更复杂的结构、联合和枚举等多个方面的问题,旨在帮助C语言学习者和开发者解决实际编程中遇到的困惑。 1. 声明和初始化部分: - 在选择整数类型时,需要考虑其表示范围,如int、short、long long等,根据实际需求来决定。 - 64位机上的64位类型通常包括long和long long,但具体取决于编译器和平台。 - 全局变量和函数的最佳定义与声明应遵循清晰、一致的命名规则,避免名字冲突和作用域混淆。 - extern在函数声明中用来指示该函数是在其他文件中定义的,提示编译器这个函数是存在的。 - auto关键字在现代C语言中主要作为默认存储类别,一般不再需要显式使用。 - 链表定义中的typedef可以简化结构体指针的使用,但需注意递归类型定义可能导致的问题。 - 复杂声明的理解需要熟悉声明的读取顺序,从右到左,从内向外。 - 函数非法重定义通常是由于多次定义或未包含头文件保护机制导致的。 - main()的正确定义通常是int main(void),void main()并不符合标准。 - 未初始化的变量值是不确定的,不能假设它们为零、空指针或浮点零。 - 动态分配的字符数组需要使用类型匹配,如char *p = (char*)malloc(10 * sizeof(char))。 - 字符串字面量的数组和指针在赋值时有区别,字符串字面量不可修改。 - 函数指针的声明和初始化可以通过赋值操作来完成,如`int (*func_ptr)(int) = some_func;`。 2. 结构、联合和枚举: - 声明struct x1{};和typedef struct {} x2;的区别在于,typedef创建了一个新的类型名。 - struct x{}; x the struct;是错误的,因为struct后需要跟一个标识符来声明结构体变量。 - 结构可以包含指向自己的指针,实现递归结构或自引用数据结构。 - 实现抽象数据类型(ADT)通常通过结构体和函数指针组合,隐藏实现细节。 - C语言本身不支持面向对象编程,但可以通过模拟(如结构体+函数指针)实现类似功能。 - 通过结构体中的单一成员数组,可以实现动态大小的结构,如struct name {int namelen; char namestr[1];},常用于动态字符串。 这本书提供了C语言实践中常见的陷阱和解决方案,对于C语言的学习和进阶都非常有帮助。"