C语言问题解答大全:495个经典疑问解析

需积分: 44 0 下载量 166 浏览量 更新于2024-07-26 收藏 1.35MB PDF 举报
"《你必须知道的495个C语言问题》是Steve Summit原著,由朱群英、孙云翻译的一本C语言问题集,包含了许多关于C语言声明、初始化、结构、联合和枚举等方面的问题解答。本书旨在帮助读者理解和解决C语言编程过程中可能遇到的各种问题。 1. C语言声明和初始化方面: - 整数类型的选取应基于所需存储数值的范围,例如使用`int`、`short`、`long`或`long long`。 - 在64位机器上,64位类型如`long`或`long long`通常用来表示64位整数。 - 全局变量和函数的最佳定义与声明方式是在相关的头文件中声明,在实现文件中定义,以避免命名冲突。 - `extern`关键字在函数声明中表示该函数是在其他地方定义的,提示编译器在链接阶段寻找其定义。 - `auto`关键字在现代C语言中很少使用,主要用于旧代码中局部变量的声明,现在通常默认就是auto类型。 - 结构体中可以包含指向自身的指针,但需要注意递归类型定义可能导致的问题。 - 非常复杂的声明可以通过自右向左的规则来理解,例如指针数组、函数指针等。 - 多次声明同一函数会导致编译错误,确保每个函数只声明一次。 - `main()`函数的正确定义通常是`int main(void)`,`void main()`不标准且可能导致问题。 - 未初始化的变量值是不确定的,全局变量的默认值不是零,而是随机的内存内容。 - 动态分配内存后,需要初始化,如`char *p = (char *)malloc(10); p[0] = 'H';`。 - 字符串字面量可以赋值给字符数组,但不能赋值给字符指针,因为字符串字面量是只读的。 - 函数指针的初始化通常涉及函数名,如`int (*func_ptr)(int) = my_function;`。 2. 结构、联合和枚举: - 声明`struct x1`和`typedef struct {} x2`的区别在于前者需要使用`struct`关键字来创建实例,后者可以直接用`x2`创建。 - `struct x{}; x the_struct;`的错误在于结构体名称和变量名称混淆,应写成`struct x the_struct;`。 - 结构体可以包含指向自身的指针,用于创建递归数据结构,如链表、树等。 - 实现抽象数据类型(ADT)通常通过结构体和相关的操作函数来完成,隐藏实现细节。 - C语言不支持面向对象编程的继承,但可以通过结构体嵌套、指针和函数模拟类似功能。 - 结构体的`struct name { int name_len; char name_str[1]; }`可能用于动态增长的字符串,`name_str[1]`是为了容纳实际长度加1。 本书不仅覆盖了这些基础问题,还深入探讨了许多高级话题,是C语言学习者和开发者的重要参考资料。"