"C语言常见问题集,这是一本专门针对C语言初学者的参考资料,包含了大量关于C语言声明、初始化、结构体、联合体、枚举等常见问题的解答。"
1. C语言中的整数类型选择:在C语言中,整数类型包括short、int、long和long long。选择哪种类型取决于你需要存储的数值范围以及平台的位数。通常,int是默认的整型,但对于64位系统,long可能是64位的。
2. 64位类型的定义:在64位系统上,通常`long`和`long long`会是64位,但具体取决于编译器和标准库的实现。使用`<stdint.h>`头文件中的固定宽度整数类型如`int64_t`可以确保跨平台的兼容性。
3. 全局变量与函数声明:全局变量是在所有函数外部定义的,它们在整个程序中都可见。函数应该在它们被调用之前声明,但为了模块化和减少依赖,推荐在头文件中声明函数,并在源文件中定义。
4. `extern`关键字:在函数声明前加上`extern`表示该函数的定义在其他地方。在头文件中通常用来告知编译器函数的存在,而在源文件中提供实际的函数定义。
5. `auto`关键字:在局部作用域中,`auto`是默认的存储类,用于声明局部变量。在现代C++中,`auto`更多的是用于类型推断,但在C语言中,它的实际用途并不常见。
6. 自引用的结构体:在C语言中,结构体可以包含指向自身的指针,这在实现链表、树等数据结构时很有用。例如,`typedef struct Node { char *item; struct Node *next; } Node;`
7. 复杂声明的理解:理解复杂的声明通常需要从右向左读取,例如,`int (*fp[N])(char *)`表示`fp`是一个指针数组,每个元素都是一个接收`char *`参数并返回`int`的函数。
8. 非法重定义:如果在同一个作用域内重复定义函数或变量,编译器会报错。确保每个标识符在其作用域内有唯一的定义。
9. `main()`的定义:标准C中,`main()`函数的定义通常是`int main(void)`或`int main(int argc, char *argv[])`。`void main()`不完全符合标准,但某些编译器可能接受。
10. 未初始化变量:未初始化的局部变量的值是不确定的。全局变量的值默认为0(整数和浮点数)、空指针或全0位的字节序列,但不应该依赖这种行为。
11. 字符串常量与字符数组:在C语言中,字符串常量是不可修改的,而字符数组可以。`"Hello, world!"`是一个字符串常量,不能在运行时修改。
12. 动态分配与初始化:`char *p = malloc(10)`分配了10个字节的内存,但并未初始化。要初始化,需要使用`strcpy(p, "string")`或其他方式。
13. 字符串常量与指针的区别:`char a[] = "string literal"`创建了一个字符数组并复制了字符串;`char *p = "string literal"`创建了一个指向字符串常量的指针。对后者进行修改会导致未定义行为。
14. 函数指针的声明与初始化:函数指针的声明如`typedef int (*func_ptr)(int)`,初始化如`func_ptr my_func = some_function;`。
15. 结构、联合和枚举:结构体用于组合不同类型的数据,联合体允许在相同内存空间中存储不同类型的变量,枚举是定义符号常量的工具。结构体可以包含指向自身的指针来实现自引用结构。
16. 抽象数据类型(ADT):在C语言中,通过结构体和函数组合可以实现ADT。例如,通过定义一个包含私有数据的结构体和一组操作这些数据的函数,可以模拟面向对象编程的封装。
17. 面向对象特性:C语言本身不支持面向对象特性,如继承和多态。但可以通过结构体模拟类,并使用函数指针实现方法调用,以达到类似的效果。
这个资源提供了丰富的C语言基础知识和常见问题解答,是学习C语言和解决编程疑惑的宝贵参考资料。