C语言问题集:从基础到高级

需积分: 0 2 下载量 58 浏览量 更新于2024-07-29 收藏 10.95MB PDF 举报
"495个c语言问题" 这篇文档是一个C语言问题集,由Steve Summit原著,并由朱群英和孙云进行了翻译和修订。它涵盖了C语言中常见的问题,包括声明和初始化、结构、联合和枚举等多个方面。这份资料旨在帮助学习者深入理解和掌握C语言的基本概念和用法。 1. 在C语言中,选择整数类型通常取决于你需要存储的数值范围以及效率要求。例如,`int`通常用于大多数计算,`short`用于节省内存,而`long`或`long long`用于大整数。 2. 在64位系统上,64位类型如`long`或`long long`通常是64位宽,但这也取决于具体的编译器和平台。 3. 全局变量和函数的最好定义与声明方式是先在头文件中声明,然后在相应的源文件中进行定义,这样可以避免命名冲突并提高代码可读性。 4. `extern`在函数声明中表示该函数是在其他地方定义的,告诉编译器函数的存在,但不提供函数体。 5. `auto`关键字在现代C++中不再常用,但在旧代码中,它用于局部变量声明,表明变量的生命周期仅限于其所在的作用域。 6. C语言允许结构体包含指向自身的指针,这在创建递归数据结构(如链表或树)时非常有用。 7. 复杂声明的解析需要理解声明的层次结构,例如,一个函数指针数组返回指向字符的指针,可以通过从右向左读取声明来理解。 8. 非法重定义通常是因为在同一作用域内多次定义了相同的标识符。确保每个函数和变量只定义一次。 9. `main()`的正确定义通常是`int main(void)`或`int main(int argc, char *argv[])`。`void main()`不是标准C的合法形式。 10. 未初始化的变量的值是不确定的,不能依赖它们默认为零、空指针或浮点零。全局变量可能会被默认初始化为零,但局部变量不会。 11. 字符串字面量不能赋给非静态字符数组,因为字符串字面量是常量,尝试修改会导致未定义行为。 12. `malloc`返回的是未初始化的内存,必须通过`strcpy`等函数安全地复制字符串到分配的内存中。 13. `char a[] = "stringliteral"`是字符串字面量的副本,可以直接修改;而`char *p = "stringliteral"`是常量字符串,不能修改。试图修改`p[i]`会导致程序崩溃。 14. 函数指针的声明类似`return_type (*pointer_name)(parameter_types)`,初始化则需要提供一个匹配的函数名或地址,如`pointer_name = function_name`。 2.1 `struct x1 {};`定义了一个结构类型,`typedef struct {} x2;`创建了一个类型别名。前者在使用时需要`struct`关键字,后者不需要。 2.2 `struct x {}; x theStruct;`是错误的,因为`x`在这里被视为一个变量名,而不是类型名。应写作`struct x theStruct;`。 2.3 结构体确实可以包含指向自己的指针,这是构建自引用结构的关键,如链表节点。 2.4 实现抽象数据类型通常通过结构体和指向结构体的指针来实现,隐藏内部实现细节,提供公共接口。 2.5 在C语言中实现枚举时,可以使用`enum`关键字定义一组命名的整数值,便于编写更清晰的代码。 这个文档是C语言初学者和进阶者的宝贵资源,包含了大量关于C语言核心概念的问题和解答,有助于加深对语言特性的理解和应用。