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

需积分: 0 11 下载量 143 浏览量 更新于2024-08-02 收藏 1.34MB PDF 举报
"《你必须知道的495个C语言问题》是一本关于C语言常见问题的电子书,由Steve Summit原著,朱群英和孙云翻译,修订至0.9.4版,日期为2005年6月23日。书中详细解答了C语言中的各种疑问,包括声明与初始化、结构、联合和枚举等多个方面的内容,旨在帮助读者深入理解和掌握C语言。 1. 声明和初始化 - 在选择整数类型时,需要考虑目标平台的字长以及数值范围需求,如int、short、long long等。 - 在64位系统上,64位类型如long通常代表64位整数,但具体依赖于编译器和标准的实现。 - 全局变量和函数的声明应尽量清晰,避免名字冲突,使用extern关键字表示外部定义的变量或函数。 - extern在函数声明中表明该函数是在其他地方定义的,而非当前文件。 - 关键字auto在现代C语言中主要在函数内部用于自动变量,但在某些旧代码中可能还有其他用途。 - 结构体可以包含指向自身的指针,但需要注意内存管理和递归定义的正确性。 - 复杂声明的理解需要熟悉C语言的类型系统,如理解指针、数组和函数的关系。 - 函数多次声明但仅定义一次可能会导致编译错误,确保每个函数在每个源文件中定义一次。 - main()函数的标准定义是int main(void),void main()在某些标准下不被接受。 - 未初始化的变量值是不确定的,不能假定其为零、空指针或浮点零。全局变量默认情况下可能会被初始化为零,局部变量则不然。 - 字符串字面量不能赋值给非数组指针,如intf(){chara[]="Hello,world!";}是错误的。 - char *p=malloc(10)需要分配后才能访问,未分配的内存不能直接赋值。 - chara[]="stringliteral";和char*p="stringliteral";的区别在于前者是字符串字面量的副本,后者是引用常量字符串,尝试修改p[i]会导致未定义行为。 - 初始化函数指针需要匹配函数类型,例如(void (*)(int))func表示func是一个接受int参数的函数。 2. 结构、联合和枚举 - 声明struct x1{};和typedef struct {} x2;的主要区别在于typedef创建了一个新的类型名,使得使用x2更加方便。 - struct x{}; x theStruct;是错误的,因为struct后需要立即跟随结构体变量名,正确的写法是struct x theStruct;。 - 结构体可以包含指向自身的指针,用于实现自引用或递归数据结构,如链表。 - 实现抽象数据类型(ADT)通常通过结构体和指针,以及私有和公共接口来实现封装。 - C语言本身不支持面向对象编程,但可以通过结构体和函数指针模拟类的某些特性,如模拟方法和继承。 - 声明结构体时,如struct name {int namelen; char namestr[1];},namestr[1]是一种技巧,用于动态增长字符串,但需要小心处理。 这本书详细解答了C语言中的各种常见问题,涵盖了声明、初始化、结构体、联合体、枚举等基础概念,对于C语言初学者和进阶者都是一份宝贵的参考资料。通过阅读和理解这些问题,读者可以更好地理解C语言的工作原理,避免常见陷阱,并提升编程技能。"