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

需积分: 0 1 下载量 37 浏览量 更新于2024-08-02 收藏 1.34MB PDF 举报
"你必须知道的495个C语言问题" C语言是计算机科学的基础,广泛应用于系统编程、嵌入式开发、游戏引擎、软件工具等各个领域。本资源是一本关于C语言常见问题的集合,由Steve Summit原著,朱群英和孙云翻译,修订版为0.9.4,日期为2005年6月23日。书中涵盖了一系列与声明、初始化、结构、联合和枚举等相关的问题,旨在帮助读者深入理解和解决C语言编程中可能遇到的困惑。 1. 在选择整数类型时,应考虑所需的数值范围、内存占用以及平台兼容性。通常,`int`是默认的整型,但在64位系统上可能不是64位的。对于需要精确64位整数的情况,应使用`long long`。 2. 在64位机器上,`long`和`long long`通常是64位,但具体取决于编译器和标准库实现。`int64_t`和`uint64_t`在`<stdint.h>`头文件中定义,是跨平台的64位整数类型。 3. 全局变量和函数的声明应在所有需要用到它们的文件之前进行,可以使用`extern`关键字在头文件中声明,以供其他文件引用。同时,全局变量应谨慎使用,以减少命名冲突和提高代码可维护性。 4. `extern`在函数声明中表示该函数是在其他地方定义的,告诉编译器函数的存在,但不提供函数的实现。 5. 关键字`auto`在旧版本的C语言中用于声明局部变量,但在C99及以后的标准中,它的使用变得多余,因为局部变量默认就是`auto`类型的。 6. 链表定义时,可以使用typedef创建一个指向结构体的指针类型。在示例中,`NODEPTR`应该是一个指向`struct`的指针。正确的定义应该是`typedef struct NODE { char *item; NODEPTR next; } NODE;`,然后可以使用`NODEPTR`声明链表节点。 7. 解析复杂声明的关键在于从右向左读取,理解每个部分的作用。例如,一个数组包含N个返回指向字符的指针的函数的指针,可以表示为`(*(*func_ptr)[N])(char *)`。 8. 重复定义的函数会导致编译错误,确保每个函数在所有文件中的定义和声明都一致。`main()`的合法定义包括`int main(void)`、`int main(int argc, char *argv[])`等,但`void main()`不是标准C的推荐形式。 9. 对于未初始化的变量,其初始值是不确定的,不能假设为任何特定值。全局变量在定义时默认初始化为零,但这不适用于局部变量。全局变量的零值不能简单地被视为空指针或浮点零。 10. 字符串字面量不能直接赋值给非字符数组,如`int f() { char a[] = "Hello, world!"; }`。应使用字符数组并使用`strcpy()`或初始化时直接指定大小,如`char a[13] = "Hello, world!";`. 11. 动态分配的内存如`char *p = malloc(10);`需要使用`calloc()`或手动初始化,因为`malloc()`返回的内存不被初始化。若要将字符数组赋值,需先用`strcpy()`或其他方法复制。 12. `char a[] = "stringliteral"`是字符串字面量的副本,而`char *p = "stringliteral"`是只读的字符串常量。尝试修改`p[i]`会导致未定义行为,如崩溃。 13. 函数指针的声明应明确指出返回类型、参数列表以及指针的类型。初始化函数指针时,需要提供函数的地址,如`void (*func_ptr)(int) = some_function;`。 14. 结构和联合声明中,`typedef`可以创建类型别名,如`typedef struct x1 {} X1;`。`struct x1 {};`声明了结构类型`x1`,而`X1 the_struct;`是类型`X1`的实例。使用`typedef`可以简化类型引用。 15. 结构可以包含指向自身的指针,这是创建递归数据结构(如链表、树等)的基础。 16. C语言中的抽象数据类型通常通过结构和函数组合实现。通过封装结构体的内部细节,提供一组操作这些结构的函数接口,可以实现类似面向对象编程的封装和隐藏。 17. C语言不具备内置的面向对象特性,如继承、多态等。但可以通过结构、指针和函数模拟这些概念,例如使用“结构体包含函数指针”的技巧来实现类似的消息传递机制。 本书详细解答了这些常见问题,是学习和解决C语言问题的宝贵资源,适合C语言初学者和有经验的开发者参考。