C语言常见问题与解答

需积分: 30 11 下载量 73 浏览量 更新于2024-08-01 收藏 1.34MB PDF 举报
"《你必须知道的495个C语言问题》是关于C语言编程中常见问题的集合,由Steve Summit原著,朱群英和孙云翻译,并在2005年6月23日修订至0.9.4版。这本书涵盖了各种容易被忽视的C语言编程细节,旨在帮助读者理解和解决实际编程中遇到的问题。" 在C语言中,了解和掌握声明和初始化是至关重要的。以下是一些关键知识点: 1. **整数类型选择**:在决定使用哪种整数类型时,应考虑所需的存储空间和数值范围。通常,`int`适用于一般计算,`short`用于节省内存,而`long`和`long long`用于表示更大范围的整数。在64位系统上,`long`可能不一定是64位,这取决于具体的编译器和平台。 2. **全局变量与函数声明**:全局变量在整个程序中可见,而函数声明用于告知编译器函数的存在,但不提供实现。最佳实践是将函数声明放在头文件中,供其他源文件包含使用,而将实现放在对应的`.c`文件中。 3. **extern的作用**:`extern`关键字用于告诉编译器变量或函数是在其他文件中定义的。在头文件中声明`extern`变量或函数,可以确保链接时能找到它们的定义。 4. **关键字auto**:在现代C语言中,`auto`作为默认的存储类别,一般不需要显式使用。但在旧代码中,它用于在函数体内声明局部变量。 5. **自引用结构体**:C语言允许结构体包含指向自身的指针,这是实现递归数据结构如链表和树的基础。 6. **复杂声明的理解**:理解复杂的声明需要从右向左读取,先看变量名,再看其类型,过程中注意解构复合类型如数组和指针。 7. **函数重定义**:C语言中,函数只能定义一次,多次定义会导致编译错误。如果在不同文件中有相同函数,只需在其中一个文件中定义,其他文件通过`extern`声明引用。 8. `main()`函数的定义:标准C中,`main()`的正确形式通常是`int main(void)`或`int main(int argc, char *argv[])`。`void main()`并不符合标准,但某些编译器可能接受。 9. **未初始化变量**:未初始化的局部变量的值是不确定的,不应依赖它们的初始值。全局变量理论上可能默认为零,但不保证为零、空指针或浮点零。 10. **字符串初始化**:`char a[] = "Hello, world!";`是正确的初始化方式,而`char *p = malloc(10);`后需要使用`strcpy()`或`memcpy()`来复制字符串,因为直接赋值会给未初始化的指针赋值。 11. **字符串字面量与字符数组的区别**:`char a[] = "stringliteral"`创建了一个字符数组并复制了字符串,可以修改;而`char *p = "stringliteral"`创建的是一个指向只读内存的指针,尝试修改会引发未定义行为。 12. **函数指针的声明与初始化**:声明函数指针时,先指定返回类型,然后是参数列表,最后是`*`和指针名称。初始化函数指针需要确保类型匹配,如`myFunctionType *myPointer = myFunction;`。 13. **结构、联合与枚举**:结构体用于组合不同类型的数据,联合用于共享内存,枚举用于定义符号常量。结构体可以包含指向自身的指针,实现自引用结构。抽象数据类型的实现通常基于结构体,通过指针操作以隐藏内部实现。 14. **面向对象编程**:虽然C语言不是面向对象的语言,但可以通过结构体和函数指针模仿类的行为。例如,通过“结构体+函数指针”的组合实现类似方法的概念。 本书深入探讨了这些主题和其他更多问题,对于C语言开发者来说,是提高技能和解决问题的宝贵资源。通过学习这些问题,程序员能更好地理解和避免编程陷阱,写出更健壮、更高效的C语言代码。