C语言常见问题解析与实战

需积分: 9 12 下载量 65 浏览量 更新于2024-08-01 2 收藏 1.34MB PDF 举报
"《你必须知道的495个C语言问题》是关于C语言编程中常见问题的集合,由Steve Summit原著,朱群英和孙云翻译,修订版为0.9.4,发布于2005年6月23日。书中涵盖了声明与初始化、结构、联合和枚举等多个主题,旨在帮助程序员解决C语言编程中可能遇到的困惑和陷阱。" 在C语言中,声明和初始化是编程的基础,理解它们的细节至关重要: 1. 整数类型的选用应根据需求来决定,如int、short、long long等,考虑存储空间和计算效率。 2. 在64位系统上,64位类型如long或long long通常是64位,但具体取决于编译器和平台。 3. 全局变量和函数的声明应尽量清晰,避免名字冲突,使用extern关键字可以在其他源文件中引用未在此文件中定义的全局变量或函数。 4. extern在函数声明中表示该函数的定义在其他地方,告诉编译器其存在。 5. auto关键字在C99标准后已较少使用,主要用于旧代码中的局部变量声明。 6. 链表的typedef声明中,结构体包含指向自身的指针是可以的,只需确保声明正确,避免循环引用导致的编译错误。 7. 复杂声明的理解需要熟悉指针、数组和函数的关系,例如解析返回指针的函数的指针数组。 8. 如果函数被定义多次,编译器会报错,函数定义应唯一。 9. main()函数的正规定义通常为int main(void),void main()在某些编译器中可能不被接受。 10. 未初始化的变量值不确定,不能假设为零。全局变量默认不初始化,局部变量未初始化时内存中可能包含任何值。 11. 字符数组在声明时必须指定大小,如intf(){chara[12]="Hello,world!";}。 12. 动态分配内存后需进行初始化,如char*p=malloc(10); *p='H';,否则访问未初始化的内存可能导致程序崩溃。 13. 字符串字面量常量如"stringliteral"在内存中是只读的,尝试修改p[i]会导致未定义行为。 14. 函数指针的声明和初始化需要匹配函数原型,例如int (*func_ptr)(int)表示返回int的函数指针,初始化则需指向相应的函数。 结构、联合和枚举是C语言中的关键数据结构: 1. 声明struct x1{};和typedef struct {} x2;的主要区别在于typedef创建了一个新的类型名x2,可以直接用于声明变量。 2. struct x{}; x the_struct;是非法的,因为结构体定义后面需要跟随声明或定义,应写为struct x the_struct;。 3. 结构体可以包含指向自身的指针,形成递归结构,但需注意内存管理和递归深度问题。 4. 实现抽象数据类型(ADT)通常通过结构体和封装函数来隐藏内部实现细节。 5. C语言不具备原生的面向对象特性,但可以通过结构体模拟类,使用函数指针模拟方法,达到类似继承的效果。 这本书的内容深入浅出,对C语言程序员来说是一份宝贵的参考资料,涵盖了从基础到高级的各种问题,有助于提高编程技巧和解决实际问题的能力。