"495个C语言经典问题" 是一本收集了C语言常见问题的书籍,由Steve Summit原著,朱群英和孙云翻译,提供了对C语言深入理解和学习的资源。书中涵盖了许多关于声明与初始化、结构、联合和枚举等方面的问题,旨在帮助读者解决在编程过程中可能遇到的困惑。
1. **声明和初始化**
- **问题1.1**:选择整数类型时,应考虑存储需求和平台兼容性。`int`通常适用于大多数情况,`short`用于节省空间,`long`和`long long`处理大整数。
- **问题1.2**:64位机上的64位类型通常包括`long`和`long long`,但具体取决于编译器和标准库。
- **问题1.3**:全局变量和函数的最佳声明应在头文件中,以避免重复声明和链接问题。使用`extern`关键字可以在其他文件中引用它们。
- **问题1.4**:`extern`在函数声明中表示该函数是在其他地方定义的,告诉编译器函数存在但未在此处定义。
- **问题1.5**:`auto`关键字在函数中自动分配变量,但在现代C++中很少使用,通常由编译器自动推断。
- **问题1.6**:可以定义含有指向自身类型的指针的结构,但要注意递归类型定义的语法正确性。
- **问题1.7**:理解复杂声明的关键是自右向左读取,结合类型修饰符(如指针、数组)和函数返回类型。
- **问题1.8**:重复定义是错误的,确保每个函数只有一个定义,或者使用`extern`声明。
- **问题1.9**:`main()`的正确定义通常是`int main(void)`或`int main(int argc, char *argv[])`。`void main()`在某些编译器上可能不被接受。
- **问题1.10**:未初始化的变量的值是不确定的,不应依赖其默认值。全局变量默认不会初始化为零,局部变量则完全未初始化。
- **问题1.11**:字符串字面量不能赋值给非静态局部数组,因为内存分配方式不同。
- **问题1.12**:`malloc()`返回的指针需要初始化为有效的内存地址,如`char *p = (char *)malloc(10);`。
- **问题1.13**:`char a[]`是数组,直接存储字符串;`char *p`是指针,需要动态分配或指向已有的字符串。对`p[i]`赋值可能导致段错误,因为它可能未分配内存。
- **问题1.14**:初始化函数指针需要将函数名作为值,如`typedef void (*func_ptr)(void); func_ptr my_ptr = my_function;`。
2. **结构、联合和枚举**
- **问题2.1**:`struct x1{}`声明了一个结构类型,而`typedef struct {} x2;`创建了一个名为`x2`的新类型,两者作用不同。
- **问题2.2**:`struct x{}; x the_struct;`错误是因为结构体名后应立即跟初始化列表或分号,而不是变量名。
- **问题2.3**:结构可以包含指向自身的指针,形成递归结构,如链表或树结构。
- **问题2.4**:实现抽象数据类型(ADT)通常涉及结构和指向结构的函数指针,以隐藏实现细节。
- **问题2.5**:C语言不是面向对象的,但可以通过结构和函数模拟面向对象特性,如封装和继承。
这本书通过解答这些问题,帮助读者深入理解C语言的核心概念和语法,解决实际编程中遇到的问题,从而提高编程技能。