"你必须知道的495个C语言问题.pdf"
C语言是计算机科学的基础,广泛应用于系统编程、嵌入式开发、游戏引擎、软件工具等。此资源是一部关于C语言常见问题的集合,由Steve Summit原著,朱群英和孙云翻译,旨在帮助程序员理解和解决在编写C语言代码时可能遇到的各种问题。
1. **声明和初始化**
- 在选择整数类型(如`int`, `short`, `long`, `long long`)时,应考虑存储需求和平台兼容性。通常,`int`是平台依赖的,但至少32位。
- 在64位系统上,`long`通常是64位,但不是所有情况下都是如此,需根据具体平台进行确认。
- 全局变量和函数的声明应尽早进行,以避免作用域和链接问题。函数应先声明后定义,全局变量可以在文件的开头或头文件中声明。
- `extern`用于在不同的源文件间声明已定义的全局变量或函数。
- 关键字`auto`在现代C语言中使用较少,它默认是局部变量的存储类别。
- 链表的typedef可以更方便地处理,但要确保避免语法错误,如自引用结构体的声明。
- 复杂声明的理解可以通过从右向左读取来帮助,例如,一个函数指针数组返回指向字符的指针。
- 重复定义是非法的,确保每个函数或变量只被定义一次。
- `main()`的正确形式通常为`int main(void)`或`int main(int argc, char *argv[])`,`void main()`在C99标准中不推荐使用。
- 未初始化的变量的值是不确定的,不应假设其为零,尤其是全局变量,它们可能被自动初始化为零,但不是总是如此。
- 字符串字面量不能赋值给非字符数组,需要使用动态分配内存(如`malloc`)。
- 对于`char *p = "stringliteral"`,`p`是一个指向只读内存的指针,修改会引发未定义行为。
- 函数指针的声明需指定返回类型和参数列表,初始化则需要一个与之匹配的函数地址。
2. **结构、联合和枚举**
- `struct x1{};`和`typedef struct {} x2;`的区别在于,前者创建了一个结构类型,后者创建了一个新的类型别名。
- 结构声明后立即使用需要花括号初始化,如`struct x xthestruct = {};`。
- 结构可以包含指向自身的指针,这是自引用结构的基础,常用于实现递归数据结构。
- 实现抽象数据类型(ADT)通常涉及结构和指向结构操作的函数指针。
- C语言本身不支持面向对象编程,但可以通过结构和函数指针模拟类似特性,如模拟类和继承。
- 结构体中的`namestr[1]`技巧用于动态增长的字符串,通过将数组大小设为1,可以利用C中的结构体字节对齐规则。
以上只是部分C语言问题的简要概述,完整的资源中包含更多关于指针操作、内存管理、预处理器、位操作、文件I/O等方面的问题解答,对于深入理解和精通C语言是非常有价值的参考资料。