C语言问题集:面试必备知识

需积分: 31 3 下载量 66 浏览量 更新于2024-07-29 收藏 1.34MB PDF 举报
"《你必须知道的495个C语言问题》是关于C语言的一本问题集,包含了面试中常见的C语言问题。书中详细解答了关于声明与初始化、结构、联合和枚举等多个方面的疑问,旨在帮助读者深入理解和应用C语言。" 1. 声明和初始化 - 在C语言中,选择整数类型(如int, short, long)应考虑所需存储的数值范围以及平台的影响。64位机上的64位类型通常包括long和long long。 - 全局变量和函数应尽早声明,最好在所有使用它们的源文件之前。extern用于在其他文件中引用未在当前文件定义的外部变量或函数。 - 关键字auto用于函数中的局部变量,但在现代C语言中,通常默认就是局部变量,因此它的使用并不常见。 - 链表定义时,可以使用typedef创建一个结构体类型别名,但确保语法正确,例如typedef struct {char *item; struct Node *next;} Node;。 - 复杂声明的理解可以通过从右向左读取来解析,例如,一个指向返回指向字符的指针的函数的指针的数组可以写作`(*(*arr[N])())[char]`。 - main()的正确定义通常是`int main(void)`,void表示不接受参数。void main()在某些编译器中可能有效,但不是标准C的一部分。 - 未初始化的变量的值是不确定的,不能依赖其初始值。全局变量在内存中默认不初始化,可能是任意值,包括零、空指针或浮点零。 - 字符串字面量不能赋给非const char类型的指针,因为字符串字面量是只读的。 - 使用malloc分配的内存需要初始化,例如`char *p = malloc(10); *p = '\0';`。 - 对于字符串字面量,`char a[] = "stringliteral"`是在编译时复制,可以修改;而`char *p = "stringliteral"`是只读的,修改会导致未定义行为。 - 函数指针的声明如`typedef return_type (*pointer_type)(parameter_types)`,初始化如`pointer_type my_func_ptr = my_function;`。 2. 结构、联合和枚举 - 声明struct x1{};和typedef struct {} x2;的区别在于,typedef创建了一个新的类型名称,使得之后可以用x2代替struct {}。 - struct x{}; x theStruct;是非法的,因为struct关键字后面需要跟类型名,而不是变量名。 - 结构可以包含指向自身的指针,这是自引用结构,常用于实现链表、树等数据结构。 - 实现抽象数据类型(ADT)通常通过结构体和访问函数来完成,隐藏结构的内部细节。 - C语言本身不支持面向对象特性,但可以通过模拟,如结构体内的函数指针实现类似继承和多态的效果。 - 枚举(enum)是定义符号常量的类型,可以用于增强代码的可读性和安全性。 这本书涵盖了C语言的基础和进阶问题,对于学习和复习C语言,以及准备C语言面试非常有帮助。通过解答这些问题,读者能够更好地掌握C语言的核心概念和实践技巧。