C语言编程常见问题解答

4星 · 超过85%的资源 需积分: 10 103 下载量 104 浏览量 更新于2024-07-25 11 收藏 1.35MB PDF 举报
"《你必须知道的495个C语言问题》是一本关于C语言常见问题的集合,由Steve Summit原著,朱群英和孙云翻译,2005年的修订版为0.9.4。这本书涵盖了C语言的各种声明、初始化、结构、联合和枚举等相关问题,旨在帮助读者解决编程中遇到的实际困扰。" 本文档主要讨论了C语言中的关键概念和常见疑惑,包括变量声明与初始化、类型定义、函数声明、指针操作以及结构体的使用等。以下是对部分问题的详细解释: 1.1 选择整数类型时,应考虑计算需求、存储限制以及平台兼容性。通常,`int`适合一般用途,`short`占用更少空间,而`long`或`long long`适用于大整数。 1.2 在64位系统上,64位类型如`long`或`long long`通常为64位,但不总是如此,因为这取决于具体实现和标准遵循情况。 1.3 全局变量和函数的最佳声明通常是在相关头文件中,使用`extern`关键字在需要的地方进行引用。这样可以保持代码模块化,提高可读性和可维护性。 1.4 `extern`在函数声明中表明该函数定义在其他地方,告诉编译器函数的存在,但不包含函数的实现。 1.5 `auto`关键字在C语言中用于局部变量声明,表示变量的作用域仅限于当前块。 1.6 C语言允许结构体包含指向自身的指针。问题中的typedef声明可能是错误的,可能需要检查语法和拼写错误。 1.7 解析复杂声明的关键是理解类型和指针的关系,从右向左读取,同时注意指针的嵌套和数组的维度。 1.8 如果出现函数非法重定义的错误,可能是因为在作用域内重复定义了同名函数。 1.9 `main()`函数的标准定义通常是`int main(void)`或`int main(int argc, char *argv[])`。`void main()`不是标准C语言所支持的。 1.10 未初始化的变量值是不确定的,不能假设它们为零、空指针或浮点零。全局变量默认不会被初始化,除非明确指定。 1.11 字符串字面量不能直接赋值给非字符数组,因此`char a[]="Hello,world!";`应改为`char a[] = {'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!', '\0'};`。 1.12 `char *p=malloc(10);`是分配内存,但需要显式地将字符串字面量复制到分配的内存中,如`strcpy(p, "string");`。 1.13 `char a[]="stringliteral";`是字符串字面量拷贝到数组,可以直接修改;而`char *p="stringliteral"`是常量字符串,尝试修改p[i]会导致程序崩溃。 1.14 函数指针声明如`typedef return_type (*pointer_name)(parameter_types)`,初始化则需要赋值为一个函数地址。 2.1 声明`struct x1{}`定义了一个匿名结构类型,而`typedef struct {} x2;`创建了一个名为`x2`的结构类型别名。两者在使用上有细微差别。 2.2 `struct x{}; x thestruct;`的错误可能是因为忘记在结构体类型后加上`*`,正确的应该是`struct x thestruct;`。 2.3 结构体可以包含指向自身的指针,这是实现递归数据结构(如链表)的基础。 2.4 实现抽象数据类型(ADT)通常通过结构体和相关的操作函数来完成,隐藏内部实现细节,提供公共接口。 2.5 C语言不具备内置的面向对象特性,但可以通过结构体模拟类,函数指针模拟方法,实现类似面向对象的设计。 这些问题是C语言初学者和进阶者都可能会遇到的典型问题,理解和掌握这些问题的解答有助于提升编程技能。书中涵盖的问题更广泛,涵盖了更多高级主题,是学习C语言不可或缺的参考资源。