C语言问题解答:选择整数类型与声明技巧

需积分: 0 1 下载量 100 浏览量 更新于2024-07-24 1 收藏 1.34MB PDF 举报
"《你必须知道的495个C语言问题》是关于C语言常见问题的集合,由Steve Summit原著,朱群英和孙云翻译。书中详细解答了关于声明和初始化、结构、联合和枚举等多个方面的疑问,旨在帮助读者深入理解和应用C语言。" 在C语言中,选择整数类型主要取决于你需要处理的数值范围和内存需求。通常,如果你需要处理超过32,767或低于-32,767的数值,可以选择`long`类型。如果内存空间至关重要,比如创建大数组或大量结构,可以使用`short`类型。默认情况下,使用`int`类型即可。无符号类型(如`unsigned int`、`unsigned long`等)适用于需要避免符号扩展的二进制操作,但混合使用有符号和无符号类型可能导致意料之外的结果,需要谨慎处理。 在64位机器上,64位类型如`long`通常表示64位整数,但这取决于具体平台的实现。确保了解你的编译器和平台是如何处理这些类型的。 声明全局变量和函数时,应尽量使其作用域最小化,以减少命名冲突和提高代码可读性。`extern`关键字用于在其他源文件中引用已定义的全局变量或函数,表示它们在别处已经定义。 `auto`关键字在现代C++中很少使用,但在旧代码中,它用于声明局部变量。现在,局部变量默认就是`auto`类型。 在C语言中,可以定义包含指向自身指针的结构,但声明时需要小心,避免无限递归或语法错误。理解复杂的声明可以通过自右向左阅读来逐步解析,例如,一个返回指针的函数的指针数组。 `main()`函数的正确定义通常是`int main(void)`,`void main()`不是标准C的写法。未初始化的变量的值是不确定的,不应依赖它们的初始值。全局变量不被显式初始化时,其值可能是零,但这并不是一个可靠的假设。对字符串字面量的修改可能导致未定义行为,如尝试改变`p[i]`。 动态分配内存后,需要初始化指针变量,如`char *p = malloc(10);`。不初始化可能导致空指针引用,从而引发程序崩溃。`char a[]="stringliteral";`是字符串字面量的副本,而`char *p="stringliteral";`是字符串常量的引用,尝试修改`p[i]`同样是非法的。 函数指针的声明和初始化是C语言中的一个重要概念,声明时指明返回类型和参数列表,初始化时则需要一个匹配的函数地址。 结构、联合和枚举是C语言中的重要组成部分,可以用来创建复杂的数据结构。`struct`声明定义了一个新的类型,`typedef`可以为这个类型提供一个别名。结构可以包含指向自身的指针,实现递归数据结构。在C中实现抽象数据类型通常通过结构和指针实现,而面向对象特性如继承在C++中更为直接,但C语言中可以通过组合和封装技巧模拟类似效果。