C语言核心知识点详解:const指针、野指针、assert断言与传值/传址
一、const 与指针权限控制的核心逻辑核心原则const 靠近谁就限制谁的修改权限共三种核心场景覆盖所有实用需求。常量指针const 修饰指向的内容规则指针 p 的指向可修改能指向其他变量但 不能通过 *p 修改指向的内容指向的内存只读。代码示例实用场景函数参数传递如 void printArr(const int *arr, int len) 防止函数意外篡改数组内容。指针常量const 修饰指针本身规则指针 p 的指向 不可修改指针本身是常量但可通过 *p 修改指向的内容。代码示例避坑点定义时必须初始化否则编译报错常量指针不可悬空。双重const同时修饰指针与内容规则指针 p 的指向不可改且通过 *p 指向的内容也不可改双重只读。代码示例适用场景保护核心数据如硬件地址、全局配置参数防止误改指向或内容。二、野指针成因与彻底规避方案野指针是指向「非法内存地址」的指针会导致程序崩溃、内存污染等问题必须从源头规避。野指针的三大成因指针未初始化定义后未赋值指向随机内存指针越界访问数组、缓冲区访问超出范围内存释放后未置空 free 或函数返回后指针仍指向已释放的内存。规避野指针的四大技巧定义即初始化默认赋 NULL 空指针指向地址0不可访问内存释放后置 NULL free§ 后立即 p NULL 用 assert 或条件判断检查指针有效性避免指针越界严格控制数组、缓冲区的访问范围。代码示例正确用法三、assert 断言调试阶段的「安全检查工具」assert 是 C 语言标准库提供的调试工具用于检查程序运行时的条件是否成立不满足则直接终止程序并输出错误信息。核心用法特性仅在「调试模式」生效Release 模式下会被编译器优化移除不影响生产环境性能。代码示例配合指针检查避坑点 assert 不能替代运行时条件判断如用户输入校验仅用于调试阶段的逻辑自检。四、传值调用 vs 传址调用函数参数传递的核心差异函数参数传递的本质是「数据拷贝」两种调用方式决定了是否能修改实参的值。传值调用值传递原理将实参的值拷贝给形参形参是独立变量函数内修改形参不会影响实参。代码示例无法修改实参适用场景仅需使用实参的值无需修改如求两数之和、打印数据。传址调用地址传递原理将实参的内存地址拷贝给形参指针变量函数内通过指针访问并修改实参的内存直接影响实参。代码示例可修改实参核心区别传值传「数据副本」传址传「数据地址」需修改实参用传址仅读用传值。核心总结const 管权限靠近内容则内容只读靠近指针则指针只读野指针要杜绝定义赋NULL、释放置NULL、访问先检查assert 善用调试阶段查逻辑Release 模式自动失效调用选对改实参用传址不修改用传值。