C语言编程疑惑解答:495个常见问题解析

需积分: 0 0 下载量 171 浏览量 更新于2024-07-28 收藏 940KB PDF 举报
"这本书涵盖了C语言编程中常见的问题和困惑,包括选择合适的整数类型、64位平台上的数据类型、全局变量与函数的声明、extern的作用、auto的关键字使用、链表的定义、复杂声明的理解、函数定义与调用的规则、main函数的正确形式、未初始化变量的值、字符串初始化的问题、动态内存分配、函数指针的声明与初始化、结构体、联合和枚举的使用,以及C语言中的面向对象编程模拟等。" 在C语言中,选择整数类型(如int, short, long, long long)应基于你需要存储的数值范围和平台的字长。64位机上的64位类型通常为long或long long,但具体取决于编译器的实现。声明全局变量和函数时,推荐先声明,再在外部用extern进行引用,以避免名字空间冲突。extern在函数声明中表示该函数是在其他地方定义的。关键字auto在现代C++中已不再常用,但在旧代码中可能用于局部变量声明。 链表定义时,可以使用typedef创建一个指向结构体的指针类型,但结构体中包含指向自身的指针需要正确处理递归定义。理解复杂声明的关键是遵循右到左的读取规则,例如,一个返回指针数组的函数。非法重定义通常是由于函数或变量在同一作用域内被多次定义。 main()函数的标准定义是int main(void),void main()在某些编译器上可能不被接受。未初始化的变量值是不确定的,全局变量默认不初始化,不应假设其为零。动态分配内存如char *p = malloc(10)需要在使用后释放,否则可能导致内存泄漏。字符串常量不能修改,因此试图向p[i]赋值会导致错误。 声明函数指针时,先指定返回类型,然后是参数列表,最后是星号(*)和指针变量名。初始化函数指针需确保其指向的函数签名匹配。结构体可以包含指向自己的指针,这在实现递归数据结构时很有用。在C中实现抽象数据类型通常通过结构体和指针操作实现。虽然C不支持真正的面向对象编程,但可以通过模拟(如结构体封装、函数指针作为成员等)来实现类似功能。 结构体声明如struct name { int namelen; char namestr[1]; }允许动态增长的字符串,但需要注意内存管理。枚举(enum)提供了一种定义符号常量的方式,可以用于简化代码并提高可读性。联合(union)则允许在相同的内存空间内存储不同类型的数据,但需要注意数据覆盖的问题。