C语言问题集锦:从声明到结构解析

需积分: 20 6 下载量 10 浏览量 更新于2024-09-19 收藏 1.47MB PDF 举报
"495个C语言问题.pdf" 是一本由Steve Summit原著,朱群英和孙云翻译的C语言问题集,包含了关于C语言声明和初始化、结构、联合和枚举等方面的常见问题解答。该资源是修订版0.9.4,发布于2005年6月23日,提供了丰富的C语言学习资料。 1. 声明和初始化 - 在选择整数类型时,应根据所需表示的数值范围和效率来决定,如int、short、long或long long。 - 64位机上的64位类型通常包括long和long long,但具体取决于编译器和平台的实现。 - 全局变量和函数的最佳定义和声明应避免名字空间污染,合理使用extern关键字,以及尽早声明,以便在整个程序中保持一致性。 - extern在函数声明中表示该函数是在其他地方定义的,这里只是告诉编译器函数的存在。 - 关键字auto在C99标准之后的使用减少,主要用于旧代码中,表示变量的作用域限制在当前块内。 - C语言中的结构体可以包含指向自己的指针,但需要正确处理递归类型和内存分配。 - 复杂声明的理解可以通过反向读取和理解每个部分的作用,例如理解函数指针和数组的关系。 - 非法重定义通常是由于在同一个作用域内多次定义同一标识符导致的。 - main()的正确定义通常是int main(void),void main()在某些编译器中可能不被接受。 - 未初始化的变量的初始值是不确定的,不应做任何假设。全局变量在C语言中默认不是零初始化的。 - 字符串字面量不能直接赋值给未初始化的char数组,需要使用strcpy()或类似的函数。 - malloc()返回的是void指针,需要强制转换后再赋值给char指针,例如(char*)malloc(10)。 - char a[]="stringliteral"是字符串字面量的复制,而char *p="stringliteral"是直接引用,对p[i]赋值会导致不可预测的结果,因为字符串字面量是常量。 - 函数指针的声明和初始化可以分开,声明时指定函数的参数和返回类型,初始化时赋予函数地址。 2. 结构、联合和枚举 - 声明struct x1{};和typedef struct {} x2;的区别在于,前者创建了一个匿名结构类型,后者创建了一个名为x2的结构类型别名。 - struct x{}; x theStruct; 错误是因为没有使用typedef关键字,正确的做法是先声明结构类型,再定义变量,如struct x x;。 - 结构体可以包含指向自己的指针,这在实现递归数据结构或自引用类型时很有用。 - 在C语言中实现抽象数据类型通常通过结构体和指向结构体的指针,以及一组操作这些结构体的函数来完成。 - C语言本身不支持面向对象编程的特性,如继承,但可以通过结构体嵌套、函数指针等方式模拟一些面向对象的概念。 这个问题集深入浅出地解答了C语言编程中常见的困惑和错误,对于初学者和有一定经验的开发者都是很好的学习和参考材料。