“495个C语言问题.pdf”是一本关于C语言问题的集合,特别关注于嵌入式开发中的常见问题。该文档由Steve Summit原著,朱群英和孙云翻译,并在2005年6月23日更新至修订版0.9.4。此资源可在www.fishc.com网站上找到更多的学习资料。
以下是部分章节内容的详细解释:
1. **声明和初始化**
- 在C语言中,选择整数类型(如int, short, long, long long)取决于你需要存储的数值范围以及平台的位宽。64位机上的64位类型通常包括long和long long。
- 全局变量和函数应在程序的外部声明(extern),以便在其他文件中使用。而在同一个文件中,它们可以直接定义。
- extern关键字在函数声明中表示该函数是在其他地方定义的,而不是在此处定义。
- 关键字auto在函数内部用于声明局部变量,但在现代C语言中,通常可以省略,因为这是默认的行为。
- 结构体可以包含指向自身的指针,但需要正确处理递归类型,避免无限循环引用的问题。
- 非常复杂的声明需要理解指针、数组和函数之间的关系,例如声明一个数组,其元素是返回指向字符的指针的函数的指针。
- 编译器报错“非法重定义”可能是因为在同一作用域内重复声明了相同的标识符。
- main()函数的标准定义是`int main(void)`,void表示不接受参数,但某些编译器也接受`void main()`,这不是标准C语言的一部分。
- 未初始化的变量的值是不确定的,不能假设其为零、空指针或浮点零。全局变量在未显式初始化时,其内存可能被填充为随机值。
- 字符串字面量不能赋值给非静态字符数组,因为字符串字面量是常量,尝试修改会导致未定义行为。
- `malloc`返回的是未初始化的内存,需要手动赋值。`char *p = malloc(10)`后,p指向的内存区域需要初始化才能安全地写入。
- `char a[] = "stringliteral"`和`char *p = "stringliteral"`的区别在于,a是一个字符数组,可以修改,而p是一个指向常量字符串的指针,不能修改。
2. **结构、联合和枚举**
- 声明struct x1{};创建了一个结构类型,而typedef struct {} x2;创建了一个匿名结构并用x2作为别名。前者需要使用struct关键字来创建结构变量,后者可以直接创建x2类型的变量。
- 语法`struct x {}; x theStruct;`是错误的,因为结构类型名和变量名之间需要使用分号,正确写法是`struct x {} theStruct;`。
- 结构可以包含指向自身的指针,这在实现自引用数据结构或实现循环链表时很有用。
- 实现抽象数据类型(ADT)通常通过结构体和指向结构体的函数指针来实现,以隐藏实现细节。
- C语言本身不支持面向对象编程(OOP)特性,如继承,但可以通过结构体嵌套、指针和函数模拟类似的功能。
以上只是文档中一小部分问题的解答,完整的文档包含了495个C语言问题,覆盖了更广泛的C语言概念和实践,对于学习和提升C语言技能,尤其是进行嵌入式开发的程序员来说,是非常宝贵的资源。