C语言编程疑惑解答——495个经典问题解析

需积分: 31 6 下载量 3 浏览量 更新于2024-07-30 收藏 1.34MB PDF 举报
“你必须知道的495个C语言问题” 这本书涵盖了C语言编程中的各种常见问题和细节,旨在帮助程序员深入理解和熟练掌握C语言。以下是部分章节和问题的详细解释: 1.1 关于整数类型的选用,C语言提供了多种整数类型,如`int`, `short`, `long`, `long long`等。选择哪种类型取决于你需要存储的数值范围以及平台的位宽。在64位系统上,通常`int`至少是32位,`long`和`long long`可能是64位。 1.2 在64位机器上,64位整型类型通常是`long`或`long long`。然而,标准并未规定64位整型的具体长度,这取决于实现。使用`stdint.h`头文件中的固定宽度类型如`int64_t`可以确保跨平台的一致性。 1.3 定义全局变量和函数时,推荐将它们放在单独的头文件中进行声明,并在对应的源文件中进行定义。使用`extern`关键字在需要的地方引入全局变量或函数的声明。 1.4 `extern`在函数声明中表示该函数是在其他地方定义的,告诉编译器函数的存在,但不包含函数体。 1.5 `auto`是C语言中默认的局部变量存储类别,但在现代C++中几乎不再使用,因为它的作用与未指定存储类别的变量相同,即自动存储。 1.6 C语言允许结构体包含指向自身的指针,问题中的typedef语法错误可能是因为缺少分号或者结构体名称和typedef名称冲突。正确的做法是:`typedef struct { char *item; struct Node *next; } Node;` 1.7 复杂声明的理解可以通过从右向左读取来辅助,例如,一个返回指向字符的指针的函数的指针数组可以写作:`int (*(*arr[N])(char *))()`。 1.8 如果函数只定义一次,但编译器提示非法重定义,可能是重复包含了包含函数声明的头文件,应使用预处理器指令`#ifndef`、`#define`和`#endif`来防止头文件的重复包含。 1.9 `main()`函数的正确定义通常为`int main(void)`或`int main(int argc, char *argv[])`。`void main()`在C99标准中不被推荐,但在某些实现中可能仍然有效。 1.10 未初始化的变量的值是不确定的,不能假设其为零、空指针或浮点零。全局变量在C语言中默认初始化为零,但局部变量则不是。 1.11 代码`int f(){char a[]="Hello,world!";}`不能编译,因为字符串字面量不能直接赋值给非静态局部数组,需要使用动态内存分配。 1.12 `char *p=malloc(10);`的初始化问题在于,`malloc`返回的是`void *`,需要显式类型转换。正确写法是`char *p = (char *)malloc(10);` 1.13 `char a[]="stringliteral";`是字符串字面量的复制,可以修改;`char *p="stringliteral";`是只读的字符串常量,尝试修改会导致未定义行为。 1.14 函数指针的声明通常像这样:`typedef int (*func_ptr)(int);`初始化则可以写成:`func_ptr ptr = some_function;` 2.x 结构、联合和枚举的章节涉及C语言的复合类型。结构可以包含指向自身的指针,用于实现链表等数据结构。抽象数据类型的实现通常通过结构体和指向结构体的指针来完成,而C语言不直接支持面向对象特性,但可以通过模拟实现,如结构体嵌套、函数指针等。 以上只是部分内容的解析,书中详细解答了495个问题,覆盖了C语言的各个方面,包括类型系统、内存管理、指针操作、预处理器、函数、文件I/O、错误处理等,对于提升C语言编程技能非常有帮助。