C语言问题详解:495个经典疑问解析

5星 · 超过95%的资源 需积分: 1 1 下载量 91 浏览量 更新于2024-07-24 收藏 1.35MB PDF 举报
"《你必须知道的495个C语言问题》是一本关于C语言常见问题的集合,由Steve Summit原著,朱群英和孙云翻译,2005年的修订版为0.9.4。这本书对于C语言的学习者,特别是准备面试或笔试的程序员来说非常有帮助,因为它涵盖了C语言中的各种问题,包括类型定义、声明与初始化、结构体、联合和枚举等关键概念。" 在C语言中,选择合适的整数类型(如int, short, long, long long)取决于你需要存储的数值范围和平台。64位机上的64位类型通常包括long和long long,但最好查阅标准以确保跨平台兼容性。声明全局变量和函数时,通常推荐在文件的外部(全局作用域)进行声明,并在需要的地方使用extern关键字来引用。extern在函数声明中表示该函数是在其他地方定义的。 auto关键字在现代C语言中并不常用,主要用于局部变量的声明,但在大多数情况下,可以省略不写,因为局部变量默认就是auto类型。在声明复杂的数据结构,如链表时,可能需要typedef来简化类型名称,但要注意避免循环引用。例如,typedef struct {...} *NODEPTR; 定义了一个指向结构体的指针类型。理解复杂的声明通常需要从右向左读取声明,例如,一个返回指向指针的函数的数组声明。 关于函数的定义和调用,每个函数只能被定义一次,但可以被多次调用。main()函数的通常定义是int main(void),虽然void main()在某些编译器下也能工作,但不符合C标准。未初始化的变量值是不确定的,全局变量可能会自动初始化为零,但不能依赖这个行为。局部变量则不会自动初始化。 在C语言中,字符串常量如"Hello, world!"不能直接赋值给动态分配的字符数组,需要使用strcpy()或类似的函数。初始化字符指针时,如char *p = "stringliteral";,p是一个指向只读内存的指针,尝试修改p[i]会导致运行时错误。而字符数组可以直接初始化,如char a[] = "stringliteral";。 声明和初始化函数指针时,首先要明确函数的返回类型和参数列表,然后用括号括起并赋值给指针变量。例如,一个返回整数的无参数函数的指针可以声明为int (*func_ptr)(),初始化则需要一个匹配的函数地址。 在结构、联合和枚举部分,声明struct x1{}和typedef struct {} x2;的区别在于typedef创建了一个新的类型名,而直接声明struct则不创建新类型。struct x{}; x theStruct;的错误是因为在声明后立即使用struct关键字是非法的,应该用typedef或extern。结构体可以包含指向自身的指针,这是自引用类型,常用于实现递归数据结构。在C语言中,通过结构体和指针可以实现类似面向对象的抽象数据类型,但没有内置的继承机制。要模拟面向对象特性,可以使用结构体封装和指针传递,以及函数指针来实现多态性。