C语言编程常见问题解答

需积分: 29 23 下载量 8 浏览量 更新于2025-01-07 收藏 1.34MB PDF 举报
"《你必须知道的495个C语言问题》是一本关于C语言常见问题的书籍,由Steve Summit原著,朱群英和孙云翻译,修订版为0.9.4,发布于2005年6月23日。这本书详细解答了关于C语言声明、初始化、结构、联合和枚举等方面的疑问,旨在帮助读者深入理解和掌握C语言。 1. 在C语言中,选择整数类型通常取决于你需要存储的数值范围和平台。例如,int通常适用于一般计算,long适合处理较大的整数,long long则用于64位系统中的大整数。64位机上的64位类型通常为long或long long。 2. 全局变量和函数的声明应尽可能清晰,避免名字冲突。extern用于在其他文件中引用未在当前文件中定义的外部变量或函数。 3. 关键字auto用于局部变量,但在现代C语言中,它的使用已经不常见,因为默认就是局部作用域。 4. 链表的typedef定义中,typedef struct{char *item; NODEPTR next;}*NODEPTR; 错误可能是由于未正确声明NODEPTR的类型。在C语言中,结构可以包含指向自身的指针,只需正确声明和初始化。 5. 声明和理解复杂声明的关键是理解类型优先级和指针的嵌套。例如,一个指向返回字符指针的函数的指针的数组的声明可能是:(int (*)(char*))[]。 6. 当一个函数只定义一次且被调用时,非法重定义的错误可能是因为重复的函数声明或定义。确保每个函数只有一个定义,并在需要的地方正确声明。 7. main()的正确定义通常是int main(),void main()不是标准C语言的规范。 8. 对于未初始化的变量,其初始值是不确定的,不应依赖它们的值。全局变量默认不会被初始化为零,而是未定义的值。空指针和浮点零是特殊值,需要显式初始化。 9. 代码int f(){char a[]="Hello,world!";}不能编译,因为字符串字面量是const的,不能赋值给非const char数组。 10. char *p=malloc(10); 的问题在于malloc返回的指针需要显式初始化为字符串,如p = malloc(11); p = "stringliteral"; 或者使用strcpy()函数。 11. char a[]="stringliteral"; 和 char *p="stringliteral"; 的区别在于,a是字符数组,可以修改,而p指向不可修改的字符串常量。尝试修改p[i]会导致未定义行为。 12. 初始化函数指针时,需要指定函数类型和参数列表,例如:int (*func_ptr)(int, int) = some_function; 13. 结构、联合和枚举的声明和使用是C语言的重要部分。struct x1{};和typedef struct {} x2;的主要区别在于,typedef创建了一个新的类型名称x2,可以直接使用。而struct x{}; x theStruct; 是定义了一个结构体类型x和一个结构体变量theStruct。 14. 结构可以包含指向自身的指针,这在实现递归数据结构或自引用结构时很有用。 15. 抽象数据类型在C中可以通过结构体和指向结构体的指针实现。通过提供一组操作(函数)来隐藏数据的具体实现,实现面向过程的封装。 16. C语言不直接支持面向对象编程的特性,如继承和多态,但可以通过结构体模拟类的行为,使用函数指针实现方法调用,以及通过组合结构体达到类似继承的效果。 这本书涵盖了C语言的基础到高级问题,对于学习和提升C语言技能非常有帮助,特别是对初学者和希望深入理解C语言特性的开发者来说。"