C语言初学者指南:常见问题与解答

需积分: 1 1 下载量 188 浏览量 更新于2024-07-23 收藏 1.35MB PDF 举报
“C语言常见问题”是一份针对C语言初学者的指南,涵盖了声明与初始化、结构、联合和枚举等多个方面的问题。该文档由Steve Summit原著,朱群英和孙云翻译,并在2005年6月23日修订至0.9.4版。 1. **声明和初始化** - 整数类型的选取应基于所需存储的数值范围,比如`int`、`short`、`long`或`long long`。 - 在64位系统上,`long`通常为64位,但具体取决于实现。 - 全局变量和函数的最佳定义与声明应在头文件中使用`extern`关键字,确保它们在多个源文件间可见。 - `auto`关键字在局部作用域中自动声明变量,但在现代C语言中并不常用,因为默认就是这种行为。 - 链表定义时,结构体可以包含指向自身的指针,只需正确处理typedef和指针类型。 1. **函数声明和定义** - 非法重定义通常是由于头文件被多次包含而未使用`#ifndef`预处理器指令来避免重复定义。 - `main()`函数的标准定义是`int main(void)`,但`void main()`在某些实现中也是允许的。 - 未初始化的变量的值是不确定的,不能依赖它们的初始值为零或空指针。 - 字符串字面量不能直接赋值给未初始化的字符数组,因为字符串字面量是常量。 - 动态分配的内存(如`malloc`)必须通过初始化来赋值,否则会引发编译错误。 - `char a[]="stringliteral";`和`char *p="stringliteral";`的区别在于前者复制字符串,后者仅创建一个指向字符串常量的指针,修改`p[i]`会导致未定义行为。 - 函数指针的声明和初始化可以通过将函数名赋值给指针变量完成。 2. **结构、联合和枚举** - 声明`struct x1{};`和`typedef struct {} x2;`的主要区别在于,前者保留了结构体名称,后者隐藏了结构体名称。 - 使用`struct x{}; x theStruct;`会报错,因为结构体名称必须在使用前声明。 - 结构体可以包含指向自身的指针,实现递归结构或自引用。 - 抽象数据类型通常通过结构体和指针结合实现,将实现细节隐藏。 - C语言不支持面向对象编程的继承,但可以通过结构体嵌套和函数指针模拟类似效果。 这份文档还讨论了更多关于枚举、指针操作、内存管理、类型转换等方面的问题,旨在帮助初学者理解和解决他们在学习C语言过程中遇到的常见问题。