C语言问题大全:解析495个经典疑问

需积分: 44 1 下载量 2 浏览量 更新于2024-07-24 收藏 1.35MB PDF 举报
"这是一本关于C语言常见问题的教程,涵盖了从声明和初始化到结构、联合和枚举等多个主题。作者Steve Summit的这部作品由朱群英和孙云翻译,详细解答了C语言初学者和专家可能遇到的各种疑难问题。书中包含495个问题,旨在帮助读者深入理解和掌握C语言的核心概念。" 正文: 1. 在C语言中,选择整数类型通常取决于你需要存储的数值范围以及效率考虑。例如,int类型在大多数系统上默认为32位,适用于一般计算;short通常为16位,适用于节省内存;long和long long分别提供更宽的表示范围。 2. 64位机上的64位类型如int64_t和uint64_t是通过stdint.h头文件定义的,这些类型确保在任何平台上都能表示64位整数。 3. 全局变量和函数的声明与定义应清晰、一致。全局变量通常在文件外部声明,并在需要的地方定义。函数的声明应在使用之前,一般在头文件中,而定义则在实现文件中。 4. extern在函数声明中表明该函数是在其他地方定义的,告诉编译器函数的存在,但不提供实现。 5. 关键字auto在C++中用于定义局部变量,但在C语言中并不常用,主要存在于旧代码中,现代C代码通常不使用它。 6. 链表的typedef声明中,typedef struct {...} *NODEPTR;定义了一个指向结构体的指针类型。如果出现编译错误,可能是由于typedef和struct的顺序或者结构体成员的定义问题。 7. 解读复杂声明的方法是逐层解析,从右向左读取。例如,一个指向返回字符指针的函数的指针数组表示为:int (*(*arr[N])(char*))(); 8. 非法重定义通常是由于在同一作用域内多次定义相同标识符。检查是否存在重复的函数声明或定义。 9. main()函数的标准定义是int main(void),但void main()在某些编译器中也是允许的,尽管不符合标准。 10. 未初始化的变量的值是不确定的,不应依赖其初始值。全局变量的默认值不是零,它们的值是未定义的。若需要零初始化,应使用静态存储类(如static)或显式初始化。 11. 字符串字面量不能赋给局部数组,因为它们在内存中是只读的。要创建字符数组,可以使用字符数组初始化,如:char a[] = {'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!', '\0'}。 12. malloc返回的是未初始化的内存,需要显式初始化,如:char *p = (char *)malloc(10); p[0] = 'a'; 然后才能赋值。 13. char a[]="stringliteral"; 是字符串字面量的复制,而char *p="stringliteral"; 是对字符串常量的引用,修改p[i]会导致未定义行为。 14. 函数指针的声明和初始化通常涉及函数返回类型、参数列表和函数名,如:int (*func_ptr)(int, int) = some_function; 初始化时要确保类型匹配。 2. 结构、联合和枚举部分讨论了如何声明和使用这些类型,包括自引用结构、抽象数据类型实现和面向对象编程的模拟方法。 例如,typedef struct name {int namelen; char namestr[1];} NAME; 这种声明定义了一个新的类型NAME,其中包含了字符串长度和可变长度的字符串。使用结构体包含指向自身的指针可以构建递归数据结构,如树或图。 总结,此资源提供了一本详细的C语言问题解答手册,对于学习和解决C语言编程中的各种问题非常有帮助。无论你是初学者还是经验丰富的开发者,都能从中受益匪浅,深入理解C语言的精髓。