"《必须弄懂的495个C语言问题》是一本针对C语言初学者和进阶者的问题解答书籍,由Steve Summit原著,朱群英和孙云翻译。书中涵盖了C语言中常见的声明、初始化、结构、联合和枚举等方面的问题,旨在帮助读者理解和解决实际编程中遇到的困惑。
1. C语言的整数类型选择:C语言提供了多种整数类型(如int, short, long, long long),选择哪种类型取决于你需要存储的数值范围以及平台的位数。在64位系统上,64位类型通常指的是long或long long。
2. extern在函数声明中的作用:extern用于告诉编译器函数的定义在其他地方,这允许你在不包含函数实现的头文件中声明函数的存在。
3. 全局变量和函数的声明与定义:全局变量应在所有需要访问它的源文件中声明,通常在头文件中;函数则只需要在一个源文件中定义,其他文件通过extern声明来使用。
4. auto关键字:在现代C语言中,auto通常作为默认的存储类别,即局部变量的声明时默认为auto,它的实际用途已经不多见。
5. 链表定义问题:在C语言中,可以通过typedef创建自引用的结构体类型,如typedef struct {char *item; NODEPTR next;} NODEPTR;这里的错误可能是由于typedef和结构体定义的位置或语法错误导致的。
6. 复杂声明的理解:通过从右到左的规则,可以逐步解析复杂声明,例如,一个指向返回字符指针的函数的指针数组。
7. 函数重复定义:在C语言中,函数只能定义一次,如果在多个源文件中出现,可能导致重复定义错误,除非其中一个定义是extern声明。
8. main()的定义:标准C规定main()函数应返回int类型,void main()在某些编译器中可能不被接受。
9. 未初始化变量的初始值:未初始化的自动变量(非静态)的初始值是不确定的,不能假设它们是零、空指针或浮点零。全局变量未初始化时,整型变量通常默认为0,但这不是必须的。
10. 字符串初始化问题:字符串字面量不能直接赋值给未指定大小的字符数组,需要指定数组长度,如intf(){char a[12]="Hello,world!";}。
11. malloc分配内存的初始化:malloc分配的内存是未初始化的,直接赋值给指针可能导致错误,需要使用calloc来分配并初始化为0,或者手动初始化。
12. 字符串常量与字符数组的区别:字符串常量是不可修改的,而字符数组可以修改。尝试修改字符串常量的内存会导致未定义行为。
13. 函数指针的声明与初始化:声明函数指针后,可以使用函数名来初始化,如int (*func_ptr)(int) = my_function;。
14. 结构、联合和枚举:结构可以包含指向自身的指针,这是创建递归或自引用数据结构的一种方式。抽象数据类型的实现通常依赖于结构,可以使用结构体封装数据和操作。
15. 面向对象特性:C语言本身不支持面向对象编程,但可以通过结构和函数模拟类的特性,比如模拟构造函数、析构函数、方法等。
这本书的每个问题都深入浅出地探讨了C语言的一个特定方面,通过这些问题的解答,读者可以更深入地理解和掌握C语言的核心概念和技巧。"