C语言编程常见问题解答

需积分: 28 1 下载量 28 浏览量 更新于2024-07-29 收藏 1.34MB PDF 举报
"《你必须知道的495个C语言问题》是关于C语言常见问题的集合,由Steve Summit原著,朱群英和孙云翻译。书中涵盖了多个主题,如声明与初始化、结构、联合和枚举等,并对一些编程中的困惑进行了解答。" 在C语言中,声明和初始化是编程的基础。以下是一些关键知识点: 1. 整数类型的选用:选择整数类型(如int, short, long, long long)应基于所需存储数值的范围和平台的字节大小。通常,int是首选类型,但在64位系统上,long long可能更适合表示大整数。 2. 64位类型的定义:在64位机器上,64位整数类型通常由long或long long表示,具体取决于编译器和标准遵循性。可以通过sizeof运算符来检查类型的大小。 3. 全局变量和函数的声明与定义:全局变量和函数应在所有使用它们的源文件之前声明,并在一个文件中定义。extern关键字用于在不定义的情况下声明变量或函数。 4. auto关键字:在现代C++中,auto关键字用于类型推断,但在C语言中,它主要用于函数局部变量声明,表明变量的生命周期仅限于该函数。 5. 链表定义:C语言中,结构可以包含指向自身的指针,用于创建链表。typedef可以帮助简化类型定义,但示例中的typedef定义存在语法错误,应修正为typedef struct {char *item; struct Node *next;} Node; 6. 复杂声明的理解:理解复杂声明的关键在于从右到左读取声明,同时注意括号和指针的嵌套。 7. 函数重定义:函数只应被定义一次。如果出现错误提示,可能是因为头文件被多次包含或定义与声明不匹配。 8. main()函数定义:在C99标准中,void main()是允许的,但在C89/90标准中,main()应该返回int类型。 9. 变量初始化:未初始化的变量值是不确定的,不能假设它们为零。全局变量通常会被自动初始化为零,但局部变量不会。 10. 字符串初始化:数组初始化如intf(){chara[]="Hello,world!";}是正确的,而动态分配的内存如char*p=malloc(10);需要通过strcpy或其他方式赋值,因为malloc只分配内存,不初始化。 11. 字符串与指针的区别:字符数组如chara[]="stringliteral"是可变的,可以修改;而char*p="stringliteral"是字符串字面量,修改会引发未定义行为。 12. 函数指针初始化:函数指针需要通过实际函数名来初始化,如`typedef void (*func_ptr)(int); func_ptr my_func = some_function;` 结构、联合和枚举也是C语言的重要部分: 1. 结构声明:struct x1{}声明了一个结构类型,而typedef struct {} x2;创建了一个名为x2的新类型。两者的差异在于类型名称的使用。 2. 结构实例化:结构实例化需使用struct关键字,如struct x x1;。 3. 自指针结构:结构可以包含指向自身的指针,这在实现递归数据结构时很有用。 4. 抽象数据类型:C语言通过结构和指针实现抽象数据类型,通过隐藏实现细节并提供接口来访问数据。 5. 面向对象特性:C语言本身不支持面向对象编程,但可以通过结构和函数模拟类的行为,例如通过指针传递结构体实现“this”指针效果。 2.6中的代码涉及结构的动态内存分配和成员访问,这部分通常用于动态构建结构体,例如动态字符串处理。 这些问题是C语言学习者经常遇到的挑战,理解和掌握这些问题有助于编写更有效、更可靠的C语言代码。