C核心知识点超详细整理 基础语法与数据类型变量与常量变量作用域与存储类别局部变量定义在函数或代码块内作用域仅限当前代码块存储在栈区离开作用域自动销毁。静态局部变量用static修饰存储在全局/静态区初始化一次生命周期持续整个程序但作用域仍为当前代码块。全局变量定义在所有函数外作用域为整个程序存储在全局/静态区生命周期持续整个程序。静态全局变量用static修饰作用域仅限当前文件避免不同文件的全局变量冲突。常量定义方式对比定义方式类型安全作用阶段适用场景const常量是编译阶段需要类型检查的常量#define宏否预处理阶段简单数值常量、代码片段替换enum枚举是编译阶段相关常量集合数据类型与类型转换基本数据类型内存大小64位系统类型大小(字节)范围bool1true/falsechar1-128~127short2-32768~32767int4-2^31~2^31-1long8-2^63~2^63-1float46~7位有效数字double815~16位有效数字类型转换规则隐式类型转换低精度类型自动转换为高精度类型如int转换为double。显式类型转换通过static_cast、const_cast等进行强制转换C风格转换如(int)3.14不推荐因为缺乏类型检查。 控制流程深度解析分支结构三目运算符细节语法condition ? expr1 : expr2右结合性优先级低于算术和关系运算符建议加括号明确逻辑。适用场景仅适合简单二选一的场景复杂逻辑建议使用if-else。if-else核心坑点else默认与最近的未配对if结合建议用大括号明确逻辑范围避免匹配错误。非零即真规则C中任何非零值都被视为真零值被视为假布尔值true等价于1false等价于0。switch语句高级用法表达式类型限制只能是整型、字符型、布尔型或枚举类型不能是浮点数或字符串。贯穿问题case块末尾必须加break否则会从匹配的case开始执行后续所有代码。多值同逻辑多个case可以共用一段代码如case 1: case 2: cout 工作日; break;。循环结构三种循环对比循环类型适用场景注意事项for已知循环次数循环变量前置定义减少重复创建while未知循环次数可能不执行避免循环内重复计算条件表达式do-while未知循环次数至少执行一次注意循环条件后面的分号循环控制进阶break跳出当前循环若嵌套循环则只跳出最内层。continue跳过本次循环剩余代码直接进入下一次循环迭代。goto可以跳出多层循环但滥用会导致代码可读性下降建议谨慎使用可优先考虑设置标志变量。 函数与面向对象进阶函数核心特性函数重载匹配规则精确匹配优先其次是常量转换、提升转换、标准转换。返回值类型不影响重载匹配只有参数的类型、个数、顺序不同才会构成重载。递归函数优化尾递归递归调用是函数的最后操作部分编译器会将其优化为循环避免栈溢出。终止条件必须明确否则会导致无限递归和栈溢出。内联函数用inline关键字修饰建议函数体短小且调用频繁的函数使用减少函数调用开销。inline是编译器的建议而非强制编译器可能拒绝内联较大的函数。面向对象核心概念类与对象类是对数据和操作数据的方法的封装相当于自定义类型对象是类的实例占用实际内存。成员变量描述对象的属性建议设为private或protected隐藏实现细节。成员函数描述对象的行为设为public作为对外接口内部辅助函数设为private。构造与析构函数构造函数无返回值与类同名支持重载用于初始化对象。默认构造函数在无自定义构造时自动生成。析构函数无参数与类同名加~仅一个用于清理对象资源。特殊构造拷贝构造函数const T用于对象拷贝移动构造函数T用于转移临时对象资源避免深拷贝。继承与多态继承方式public继承保留基类成员的访问权限protected继承将基类public成员变为protectedprivate继承将基类所有成员变为private。多态通过虚函数实现基类指针或引用指向派生类对象时调用派生类重写的虚函数。抽象类包含纯虚函数virtual void func() 0不能实例化用于定义接口。️ STL容器与算法详解常用容器特性容器底层实现访问方式插入删除效率迭代器稳定性适用场景vector动态数组随机访问尾部O(1)中间O(n)插入/删除导致迭代器失效频繁随机访问尾部增删list双向链表顺序访问任意位置O(1)迭代器稳定频繁插入删除操作deque分段数组随机访问首尾O(1)中间O(n)插入/删除导致迭代器失效首尾频繁增删的队列map红黑树键访问O(logn)迭代器稳定有序键值对存储高效查找unordered_map哈希表键访问O(1)平均插入可能导致迭代器失效无序键值对存储快速查找容器使用技巧vector提前用reserve预留内存避免频繁扩容批量删除元素用erase结合remove减少元素移动次数。stringfind方法查找子串返回string::npos表示未找到replace方法替换子串可指定替换起始位置和长度substr方法获取子串参数为起始位置和长度。map用[]运算符访问键值对若键不存在则插入默认值用find方法查找键返回迭代器未找到则返回map::end()。 内存管理与智能指针内存分区与动态内存内存分区栈区存储局部变量和函数参数自动分配和释放内存空间有限。堆区动态分配内存new/malloc需手动释放delete/free否则会导致内存泄漏。全局/静态区存储全局变量、静态变量和字符串常量生命周期持续整个程序。代码段存储函数体和类成员函数的机器指令只读。new/delete与malloc/free对比特性new/deletemalloc/free类型检查是否自动调用构造/析构是否返回值类型对应类型指针void*异常机制抛出bad_alloc异常返回NULL智能指针详解unique_ptr独占所有权同一时间只能有一个unique_ptr指向同一个对象通过std::move转移所有权不能直接拷贝。shared_ptr共享所有权使用引用计数跟踪对象当引用计数为0时自动释放内存可通过use_count方法查看当前引用计数。weak_ptr解决shared_ptr的循环引用问题不增加引用计数可通过lock方法获取shared_ptr访问对象。 现代C特性(C11及以后)列表初始化与auto列表初始化统一的初始化语法用{}进行初始化避免窄化转换如将浮点数转换为整数语法更简洁。auto类型推导编译器自动推导变量类型简化代码尤其适用于复杂类型如迭代器、Lambda表达式但要注意auto不会推导引用和const属性除非明确指定。Lambda表达式与线程Lambda表达式定义匿名函数的语法格式为[捕获列表](参数列表) - 返回类型 { 函数体 }。捕获方式[]无捕获[]值捕获所有外部变量[]引用捕获所有外部变量[x, y]值捕获x引用捕获y。适用场景用于算法的自定义比较函数、异步任务的回调函数等。线程操作std::thread创建线程join方法等待线程执行完毕detach方法让线程在后台执行。std::mutex实现互斥锁保护共享资源避免数据竞争std::lock_guard自动管理锁的生命周期防止死锁。