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

需积分: 1 2 下载量 16 浏览量 更新于2024-07-24 收藏 1.35MB PDF 举报
"这是一本关于C语言的问题集,涵盖了从基础到高级的各种问题,适合C语言初学者和有经验的程序员。书中讨论了声明与初始化、结构、联合和枚举等多个主题,帮助读者深入理解C语言的细节。" 1. 声明和初始化 - 在选择整数类型时,应考虑效率和平台兼容性,如int通常适用于一般计算,long long用于大整数,short节省存储空间。 - 64位机上的64位类型如`long`或`long long`,取决于编译器和标准的实现。 - 全局变量和函数的声明应尽量简洁明了,避免作用域混乱。在头文件中使用extern声明外部变量或函数,以便在其他源文件中使用。 - extern在函数声明中表示该函数是在其他地方定义的,告诉编译器函数存在但不提供实现。 - 关键字auto在现代C++中已不常用,但在早期版本中,用于局部变量声明,表明变量的作用域仅限于当前块。 1. 链表和复杂声明 - 在C语言中,结构可以包含指向自己的指针,但typedef struct {...} *NODEPTR; 的语法有误,应改为typedef struct NODE { char *item; struct NODE *next; } NODEPTR; - 复杂声明的解析遵循从右到左的规则,例如,一个返回指向字符的指针的函数的指针的数组可以写作`int (*(*arr)[N])(char *)`。 - 函数的重复声明可能是由于头文件被多次包含,应使用预处理器指令`#ifndef/#define/#endif`防止重复包含。 1. main()的定义 - C99标准允许`void main()`,但C89/90标准建议使用`int main(void)`。现代C编程推荐使用`int main(void)`。 - 全局变量的默认初始值是不确定的,不能假定为零。需要显式初始化。 - `char a[]="Hello,world!";` 是正确的,而`char *p="Hello,world!";`则定义了一个指向字符串常量的指针,不可修改。 - `char *p=malloc(10);`是不完全的,因为分配的内存未初始化,应使用`char *p=malloc(10); p[0]='\0';`或直接使用`calloc`。 1. 结构、联合和枚举 - `struct x1{};`是结构声明,`typedef struct {} x2;`是结构类型定义,后者创建了新的类型名x2。两者的区别在于使用时是否需要struct关键字。 - `struct x{}; x theStruct;` 错误是因为结构体名不是类型名,应写为`struct x theStruct;`。 - 结构可以包含指向自身的指针,形成递归定义,但需小心处理内存和循环引用。 - 抽象数据类型的实现通常通过结构和指向结构的指针来实现,以隐藏实现细节。 - C语言不支持直接的面向对象特性,但可以通过结构和函数指针模拟类和继承的效果。 这些知识点涵盖了C语言的基本要素,包括类型选择、内存管理、声明规则以及面向对象的模拟,对理解和提升C语言编程技能至关重要。通过学习这些问题和解答,读者能更好地应对实际编程中的挑战。