"ccfaq-0.9.4.pdf 是一份关于C语言常见问题的文档,由Steve Summit原著,朱群英和孙云翻译,修订版为0.9.4,发布于2005年6月23日。文档包含了各种C语言编程中的常见疑问和解答,涉及类型定义、变量声明、初始化、函数声明与定义、指针操作、结构体与联合体、枚举等内容。"
在C语言中,选择整数类型取决于你需要存储的数值范围,例如`int`通常用于常规计算,`short`占用较少空间,而`long`和`long long`适用于大整数。64位机上的64位类型通常包括`long`和`long long`。
全局变量和函数的声明应清晰且一致,避免名字冲突。`extern`用于声明一个已在其他地方定义的变量或函数。在函数声明中,`extern`表示该函数定义在别的文件中。
`auto`关键字在函数内部默认就是变量的作用域,现在很少使用,因为C99标准之后的局部变量默认就有此特性。
在链表定义中,可以使用结构体包含指向自身的指针,但需要注意语法正确性。例如,正确的typedef应该如下所示:
```c
typedef struct NODE {
char *item;
struct NODE *next;
} NODEPTR;
```
理解复杂声明的关键是逐层解析,从右到左,先看变量名,再看类型修饰。例如,一个指向返回字符指针的函数的指针的数组可以表示为`(char *(*[])())`。
函数定义只能有一个,重复定义会导致编译错误。`main()`的正确形式通常是`int main(void)`,在C99标准以后,`void main()`不被推荐使用。
未初始化的变量值是不确定的,全局变量通常会被自动初始化为0,但这并不意味着它们是空指针或浮点零。对未初始化的指针解引用会导致未定义行为。
在C语言中,字符串字面量不能赋值给动态分配的内存,如`char *p = malloc(10); p = "Hello,world!";`是错误的。应该使用`strcpy`或`strncpy`函数。
`char a[]="stringliteral";`是在编译时复制字符串,而`char *p="stringliteral"`指向常量区的字符串,尝试修改`p[i]`会导致程序崩溃,因为常量区的内存不可修改。
函数指针的声明需要指定返回值类型和参数列表,初始化则需要一个匹配的函数地址,如`int (*func_ptr)(int, int) = my_function;`。
在C语言中,`struct`定义后必须用分号结束,如`struct x1 {};`。`typedef`结构体类型可以省略分号,如`typedef struct {} x2;`。`x the struct;`是错误的,应该是`struct x x;`。
结构体可以包含指向自己的指针,这是创建递归数据结构的基础,如链表节点。
抽象数据类型的实现通常通过结构体和指向结构体的指针来隐藏内部实现细节。C语言没有内置的面向对象特性,但可以通过模拟,如结构体指针作为对象,函数指针作为方法来实现类似的功能。
枚举(enum)用于定义一组命名的整数常量,有助于提高代码的可读性和维护性。
这份文档是学习和解决C语言编程中常见问题的宝贵资源,涵盖了从基础到进阶的各种主题,有助于提升C语言编程技能。