"《你必须知道的495个C语言问题》是一本关于C语言常见问题的集合,由Steve Summit原著,朱群英和孙云翻译,2005年6月修订至0.9.4版。本书涵盖了C语言的声明与初始化、结构、联合和枚举等多个方面的知识点,旨在帮助读者理解和解决在编程过程中可能遇到的问题。
1. 关于声明和初始化:
- 在选择整数类型时,应考虑所需的数值范围和平台兼容性,例如int、short、long long等。
- 在64位系统上,64位类型如long通常表示64位整数,但具体情况可能因编译器和标准库而异。
- 全局变量和函数的最好定义方式是在相关头文件中声明,在实现文件中定义,以避免重复定义和链接错误。
- extern在函数声明中表示该函数是在其他地方定义的,是函数原型的一种声明。
- auto关键字在现代C++中不再常用,但在老版本的C语言中用于指定局部变量的存储类别。
- 结构体中可以包含指向自身的指针,但需要正确处理内存分配和类型定义。
- 复杂声明的理解可以通过自右向左的规则进行,先理解基本类型,再逐步解析指针和数组等修饰符。
- 如果函数只定义一次,但编译器报重定义错误,可能是头文件被多次包含,需使用#include guards或extern "C"避免。
- main()的正确定义通常是int main(void),void main()不是标准C语言的写法。
- 未初始化的变量值是不确定的,不应依赖其初始值。全局变量通常会被自动初始化为零,但不适用于空指针或浮点零。
- 在C语言中,字符串字面量不能赋值给非静态字符数组,如intf(){chara[]="Hello,world!";}是错误的。
- char *p=malloc(10)需要显式初始化,例如用strcpy()将字符串复制到分配的内存中,因为分配的内存默认不包含任何字符。
- chara[]="stringliteral"和char*p="stringliteral"的区别在于,前者是字符数组,后者是字符串字面量的指针,对后者进行修改会导致未定义行为。
- 函数指针的声明和初始化可以通过声明函数类型,然后将函数名赋值给指针变量来完成。
2. 结构、联合和枚举:
- 声明struct x1{}和typedef struct {} x2;的不同在于,typedef创建了一个新的类型名称x2,而struct x1{}只是定义了一个结构体类型。
- struct x{}; x theStruct;是错误的,因为结构体类型名后应立即跟随结构体变量的定义,例如struct x x1;。
- 结构体可以包含指向自身的指针,这是自引用类型,常用于链表、树等数据结构。
- 实现抽象数据类型(ADT)通常通过结构体和函数指针组合,以隐藏实现细节。
- C语言本身不支持面向对象特性,但可以通过结构体模拟类,以及通过函数指针模拟方法。
- 枚举(enum)是定义一组符号常量的工具,可用于简化代码和提高可读性。
以上内容仅是《你必须知道的495个C语言问题》的一部分,书中详细解答了更多关于C语言的常见问题,是学习和提升C语言技能的重要参考。"