C语言编程常见问题解答

需积分: 13 0 下载量 179 浏览量 更新于2024-09-19 收藏 1.35MB PDF 举报
"《你必须知道的495个编程问题》是一本关于C语言编程的常见问题集合,由Steve Summit原著,朱群英和孙云翻译,2005年6月修订至0.9.4版。本书旨在帮助程序员提升C语言编程水平,解答在编程过程中可能遇到的各种疑惑和陷阱。" 在C语言编程中,了解并掌握以下知识点至关重要: 1. 整数类型的选取:在C语言中,选择整数类型(如int, short, long, long long)应根据实际需求和平台兼容性来决定。例如,对于64位系统,long通常表示64位整数,但在某些32位系统上可能是32位。 2. 64位类型的定义:在64位系统上,类型如long long通常用于表示64位数值,但具体依赖于编译器和平台的实现。 3. 全局变量和函数的声明与定义:全局变量和函数应在所有需要用到它们的文件之前进行声明,并在至少一个文件中定义。extern关键字用于在未定义的地方引用全局变量或函数。 4. auto关键字:在现代C++中,auto关键字用于类型推断,但在C语言中,它通常用于局部变量的声明,但在大多数情况下,它的使用是可选的。 5. 链表定义:在C语言中,可以创建包含指向自身类型的指针的结构,但需要正确处理typedef和结构体声明。例如,定义一个链表节点结构时,typedef struct {...} *NODEPTR; 是可行的,但需要注意语法的正确性。 6. 复杂声明的理解:理解复杂的声明需要掌握C语言的类型系统,特别是指针和数组的结合。例如,声明一个函数指针数组,返回指向字符的指针,需要熟悉指针和数组的嵌套规则。 7. 函数重定义:在C语言中,函数只能定义一次,多次定义会导致编译错误。确保每个函数在每个源文件中只被定义一次。 8. main()函数的定义:main()函数的标准定义是`int main(void)`或`int main(int argc, char *argv[])`。void main()不是标准C的写法,虽然在某些编译器上可能能工作。 9. 变量初始化:未初始化的变量其值是不确定的,不应依赖于它们的初始值。全局变量通常会被自动初始化为零,但局部变量不会。空指针和浮点零需要通过显式赋值来设定。 10. 字符串初始化:数组如`char a[] = "Hello, world!";`是合法的字符串初始化,而`char *p = "Hello, world!";`是字符串常量的指针,尝试修改p[i]会导致未定义行为。 11. 动态内存分配:动态分配内存如`char *p = malloc(10);`需要初始化,否则编译器会报错,因为指针p尚未指向有效的内存区域。 12. 指针和字符串常量:`char a[] = "stringliteral";`是字符数组,可以直接修改;`char *p = "stringliteral";`是字符串常量指针,修改会导致错误。 13. 函数指针的声明和初始化:声明函数指针后,可以通过函数名和括号内参数类型进行初始化,例如`typedef void (*func_ptr)(int); func_ptr my_func = my_function;` 14. 结构、联合和枚举:结构体可以包含指向自身的指针,这是实现递归数据类型或自引用结构的基础。typedef可以简化结构体的使用。结构体可以用来实现抽象数据类型,但C语言不支持面向对象编程的继承特性。可以使用组合(Composition)和封装(Encapsulation)来模拟这些概念。 2.6 结构体中的变长数组:结构体可以包含一个变长数组,如`struct name { int namelen; char namestr[1]; };`,这样的结构可以用来存储可变长度的字符串,通过将namelen设置为实际长度,namestr数组可以动态扩展。 以上知识点是C语言编程中常见的问题和技巧,理解和掌握它们将有助于编写更高效、更可靠的C语言程序。