C语言问题集:解析常见挑战与疑问

需积分: 9 2 下载量 127 浏览量 更新于2024-07-29 收藏 1.34MB PDF 举报
"《你必须知道的495个C语言问题》是关于C语言编程常见问题的集合,由Steve Summit原著,朱群英和孙云翻译,包含了多个关于声明、初始化、结构、联合和枚举等方面的疑问解答。" 本文档主要探讨了C语言中的核心概念,包括类型选择、64位类型、全局变量与函数声明、extern的作用、auto关键字的用途、自引用的结构定义、复杂声明的理解、函数定义与重定义、main函数的正确形式、未初始化变量的默认值、字符串与字符数组的初始化、函数指针的声明与初始化、结构体与联合体的使用以及面向对象编程的概念。 1. 在选择整数类型时,应考虑所需的数值范围和效率,如int、short、long和long long等。 2. 64位机上的64位类型通常是long或long long,具体依赖于编译器的实现。 3. 全局变量和函数的最佳定义和声明应确保作用域清晰,避免命名冲突,并使用extern在其他文件中进行引用。 4. extern在函数声明中表示该函数是在其他地方定义的,告诉编译器函数的存在。 5. auto关键字在现代C++中不再常用,但在旧代码中可能用于局部变量声明。 6. 结构体可以包含指向自身的指针,但需要注意递归引用可能导致的问题。 7. 复杂声明通常涉及嵌套的指针和数组,理解时需从右向左读取,先看变量名,再看其类型。 8. 如果函数只定义了一次但编译器报重定义错误,可能是因为多次包含了包含函数定义的头文件。 9. main函数的标准定义是`int main(void)`,void表示不接受参数,但某些情况下也可接受命令行参数。 10. 未初始化的全局变量通常会被赋予不确定的值,不应假设它们为零、空指针或浮点零。 11. 字符串常量不能被修改,因此试图修改如`char *p = "Hello, world!";`中的p[i]会导致未定义行为。 12. `char *p = malloc(10);`的初始化问题可能是因为没有分配足够的空间来存放字符串终止符,或忘记包含`<stdlib.h>`头文件。 13. `char a[] = "stringliteral";`是一个数组,而`char *p = "stringliteral";`是字符串指针,对数组元素的修改会改变内存,而对指针的修改则不会。 14. 函数指针的声明如`typedef void (*func_ptr)(int);`,初始化可通过`func_ptr my_func = some_function;`。 结构、联合和枚举方面: 1. 声明`struct x1{};`定义了一个结构类型,而`typedef struct {} x2;`创建了一个类型别名。 2. `struct x{}; x the_struct;`不正确,因为需要使用`struct x the_struct;`来创建结构实例。 3. 结构可以包含指向自己的指针,实现递归结构或自引用结构。 4. 实现抽象数据类型(ADT)通常通过将数据结构和操作封装在结构体内,提供访问函数。 5. C语言没有内置的面向对象特性,但可以通过结构体和函数指针模拟类的行为,实现类似继承的效果。 文档中还提到了其他更深入的问题,如动态内存分配、指针运算、位操作、预处理器宏以及枚举的使用等。这些问题覆盖了C语言的基础和进阶知识,对于学习和理解C语言编程非常有帮助。