C语言精粹:495个常见问题解析

需积分: 0 5 下载量 53 浏览量 更新于2024-07-31 收藏 1.34MB PDF 举报
"C语言常见问题集,包含495个问题的C语言进阶教程,由Steve Summit原著,朱群英、孙云翻译,修订版0.9.4,2005年6月23日发布。" 本文档是针对C语言编程者的一份深入学习资料,旨在解答在编程过程中可能遇到的各种问题。以下是部分问题及其解析: 1.1 关于整数类型的选取,你应该根据需求选择合适的数据类型。例如,如果你需要存储较小的整数,可以选择`int`, `short`, 如果需要更大的整数,则可选`long`或`long long`。在64位系统上,`long`通常为64位,但不是所有情况下都是如此,因此应根据具体平台和标准进行选择。 1.2 在64位机器上,64位整型通常由`long`或`long long`表示。但要注意,不同的操作系统和编译器可能有不同的实现,需查阅相应平台的文档或使用`stdint.h`中的固定宽度类型确保跨平台兼容性。 1.3 全局变量和函数的最佳声明应遵循作用域和可见性的原则。全局变量通常在文件外部声明,以供多个函数共享;函数应在其被使用的文件中声明,或者在头文件中声明以供其他文件使用,并在对应的源文件中定义。 1.4 `extern`关键字用于在函数声明中表示该函数是在其他地方定义的。在头文件中,你通常会看到`extern`关键字与函数声明一起使用,告诉编译器函数的定义存在于别的地方。 1.5 `auto`关键字在C语言中用于默认的局部变量声明,但在现代C++中几乎不再使用,因为它是默认的行为。在C99标准以后,`auto`被赋予了新的含义,作为变量推断类型的关键字。 1.6 结构体可以包含指向自身的指针。问题中的typedef语句有误,应更改为`typedef struct { char *item; struct NODEPTR *next; } NODEPTR;`。这里的`struct NODEPTR *next;`声明了一个指向自身类型的指针。 1.7 解读复杂声明的关键是按照右到左的顺序阅读,先理解基本类型,然后是数组、指针等修饰符。例如,一个指向返回字符指针的函数的指针数组,可以写作`(int (*)(char*))[]`。 1.8 函数定义只能在一个地方,多次定义会导致编译错误。如果遇到重复定义的错误,检查是否有多余的函数定义或包含错误的头文件。 1.9 `main()`函数的正规定义通常是`int main(void)`或`int main(int argc, char *argv[])`。`void main()`虽然在某些情况下可能能工作,但不符合标准,不推荐使用。 1.10 未初始化的变量的值是不确定的,不应依赖其初始值。全局变量理论上可能会被初始化为零,但不是总是如此。它们不能被视为可靠的空指针或浮点零。 1.11 字符串字面量不能直接赋值给未声明长度的字符数组,因为编译器无法确定数组大小。应使用已知长度的数组,如`char a[13] = "Hello, world!";`。 1.12 `malloc()`返回的是未初始化的内存,需要显式赋值。`char *p = malloc(10);`之后,需要`p[0] = 's';`之类的操作来初始化。 1.13 `char a[] = "stringliteral";`创建了一个字符串字面量的副本,而`char *p = "stringliteral";`仅创建了一个指向常量字符串的指针。尝试修改`p[i]`会导致程序崩溃,因为常量字符串不可修改。 1.14 初始化函数指针的方法是直接将函数名赋值给它,例如`void (*func_ptr)(int) = my_function;`。 2.1 `struct x1 {};`定义了一个匿名结构类型,而`typedef struct {} x2;`创建了一个名为`x2`的类型别名。两者主要区别在于后者提供了类型名。 2.2 `struct x{}; x the_struct;`的错误在于没有指定结构类型名称。正确做法是`struct x the_struct;`。 2.3 结构体可以包含指向自身的指针,这是实现递归数据结构(如链表)或自引用类型的一种方式。 2.4 实现抽象数据类型(ADT)通常通过结构体和指向结构体的指针完成,隐藏实现细节,提供公共接口。 2.5 C语言本身并不支持面向对象编程特性,但可以通过结构体模拟类的结构,使用指针作为对象,以及通过函数指针模拟方法来实现类似的功能。 这些是C语言学习过程中的一些关键问题和解答,涵盖声明、初始化、类型、结构体等多个方面。通过理解和解决这些问题,开发者能够更好地掌握C语言的核心概念和实践技巧。